分类 Code 下的文章

背景

同事最近写一个算法,里面用到了这个scipy.signal.savgol_filter函数,结果在她自己的电脑上面运行正常,到了客户的电脑上面运行就出错了,因为是打包为exe的方式使用的,所以弹出的错误窗体也是一闪而过,不容易看清,后来仔细观察了一下才发现,原来客户电脑的用户名是中文的,冏。

解决

也不能要求所有客户都把用户名改为英文的啊,所以只能是从程序上面想办法解决,查来查去的,后来终于从两篇文章里面得到了灵感,在代码中加入了两条语句:

import _locale;
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])

经过测试,这样一弄就可以正常使用scipy.signal.savgol_filter函数了。

参考文章

文章1:解决Python在windows平台默认编码(encoding)为gbk所导致的open()函数报错及其他编码问题
文章2:windows下中文用户名造成的加载失败问题

在4K显示器下设计窗体的时候,总是会看到分辨率的相关提示,如果不是在100%缩放比例下设计窗体到时候就会出现一些问题。这个窗体设计器的缩放问题其实N久之前就存在,微软也一直不解决,不知道是咋回事。

懒得每次都点击这个提示重新启动VS,所以还是从网上找了一下处理办法:Windows10显示缩放导致Visual Studio 2017 WinForm窗体设计器在高DPI下设计时界面/布局/大小问题,按这个弄了一下,看看这个还是2017的解决办法,现在已经是2022了,还是存在这个问题,真是没招😒

早上来打开vs2022准备继续修改程序的时候发现git的对比工具无法使用了,提示【未能启动已配置的比较工具】:
Snipaste_2022-10-31_09-10-57.webp
我开始的时候还以为是默认比较工具被修改了呢,但是从选项里面把默认的比较工具设置为VS也一样,还是同样的提示,后来从网上查了一下,原来是关掉行暂存就可以解决了这个问题了:https://www.coderbusy.com/archives/2616.html

VB.NET

Private ReadOnly PMod As New Process()

PMod.StartInfo.FileName = "x.exe"
PMod.StartInfo.UseShellExecute = False
PMod.StartInfo.RedirectStandardOutput = True
PMod.StartInfo.CreateNoWindow = True

PMod.Start()
If PMod.WaitForExit(60000) Then
    Dim message = PMod.StandardOutput.ReadToEnd().Split(New Char() {vbCrLf}, StringSplitOptions.RemoveEmptyEntries).ToList()
    If message.Count > 0 Then
        Debur.Print(String.Join("-", message))
    End If    
End If

CSharp

using ImageProcessor;
using System;
using System.Drawing;

internal class WebpClass
{
    public static (bool successful, Image image, string error) LoadPicture(string fileName)
    {
        try
        {
            using (ImageFactory pif = new ImageFactory())
            {
                var result = pif.Load(fileName);
                if (result.Image != null)
                {
                    return (true, new Bitmap(pif.Load(fileName).Image), null);
                }
                else
                {
                    return (false, null, "读取失败!");
                }
            }
        }
        catch (Exception ex)
        {
            return (false, null, ex.Message);
        }
    }

    public static (bool successful, string error) SaveWebp(string fileName, Image img, int quality = 100)
    {
        try
        {
            using (ImageFactory pif = new ImageFactory())
            {
                pif.Load(img);
                pif.PreserveExifData = true;
                pif.Format(new ImageProcessor.Plugins.WebP.Imaging.Formats.WebPFormat() { Quality = quality <= 50 ? 50 : quality });
                pif.Save(fileName);

                return (true, null);
            }
        }
        catch (Exception ex)
        {

            return (false, ex.Message);
        }
    }
}

VB.NET

Imports ImageProcessor

Public Class webp

    ''' <summary>
    ''' 将输入的图像保存为webp图像。
    ''' </summary>
    ''' <param name="fn"></param>
    ''' <param name="img"></param>
    ''' <param name="quality"></param>
    ''' <returns></returns>
    Shared Function SaveWebp(fn As String, img As Image, Optional quality As Integer = 100) As Boolean
        Try
            Using ipf As New ImageFactory

                ipf.Load(img)
                ipf.PreserveExifData = False
                ipf.Format(New Plugins.WebP.Imaging.Formats.WebPFormat() With {.Quality = If(quality <= 50, 50, quality)})
                ipf.Save(fn)

                Return True

            End Using
        Catch ex As Exception
            'MessageBox.Show($"保存webp失败!{ex.Message}", "webp", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End Try
    End Function

    ''' <summary>
    ''' 读取指定文件名的文件,返回图像。
    ''' </summary>
    ''' <param name="fn"></param>
    ''' <returns></returns>
    Shared Function Load(fn As String) As Image
        Try
            Using pif As New ImageFactory
                Return New Bitmap(pif.Load(fn).Image)
            End Using
        Catch ex As Exception
            'MessageBox.Show($"保存webp失败!{ex.Message}", "webp", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return Nothing
        End Try
    End Function

End Class