WinForm - 像素字体未正确渲染

问题描述 投票:0回答:1

我正在尝试使用像素样式字体在 WinForm 中的位图上写入文本。 我使用的字体是这样的:https://font.download/font/pocket-pixel.

我希望文本非常小(6pt)并且像素完美,没有抗锯齿,但是当在位图上绘制文本时,它与字体不匹配。

在图像编辑软件(我的例子是Paint.NET)中使用该字体时,我将大小设置为6 pt,结果是完美的。

当我继续使用相同的字体在 WinFrom 中的位图上绘制文本时,结果既小又混乱,即使在较高的字体大小下也是如此。

我有一个模板位图和作为资源嵌入的字体文件。这是一个代码片段:

public class Class1 
{
    private static PrivateFontCollection fonts = new PrivateFontCollection();

    static FontFamily LoadFontResource(byte[] fontData)
    {
        IntPtr fontPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(fontData.Length);
        System.Runtime.InteropServices.Marshal.Copy(fontData, 0, fontPtr, fontData.Length);
        uint dummy = 0;
        fonts.AddMemoryFont(fontPtr, fontData.Length);
        AddFontMemResourceEx(fontPtr, (uint)fontData.Length, IntPtr.Zero, ref dummy);
        System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr);
    
        return fonts.Families.Last();
    }

    public Bitmap GetBitmap()
    {
        var bmp = new Bitmap(Resources.template);
    
        FontFamily PocketPixel_FontFamily = LoadFontResource(Resources.pokemon_pixel_font);
        Font PocketPixel_Font = new Font(PocketPixel_FontFamily, 12, GraphicsUnit.Pixel);    
        
        using (Graphics graphics = Graphics.FromImage(bmp))
        {
            Brush brush = Brushes.Black;
            StringFormat format = new StringFormat
            {
                Alignment = StringAlignment.Center, // Justify center
                LineAlignment = StringAlignment.Near
            };
        
            // Disable anti-aliasing
            graphics.SmoothingMode = SmoothingMode.None;
            graphics.PixelOffsetMode = PixelOffsetMode.None;
            graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
            graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
            
            graphics.PageUnit = GraphicsUnit.Pixel;
            graphics.PageScale = 1f;
            
            // Draw text
            RectangleF area = new RectangleF(20, 145, 100, 10);
            graphics.DrawString("1234567890", PocketPixel_Font, brush, area, format);
        }
        
        return bmp;
    
    }

    public SavePng()
    {
        var bmp = GetBitmap();
        bmp.Save("WhyYouNoWork.png", ImageFormat.Png);
    }

}

如您所见,我尝试更改 Graphics 对象或 Font 对象本身的多个属性以获得所需的结果,但没有成功。

有什么建议吗(请为图片点赞)?

谢谢你

winforms fonts bitmap pixel
1个回答
0
投票

我刚刚发现我导入了错误的字体:

FontFamily PocketPixel_FontFamily = LoadFontResource(Resources.pokemon_pixel_font);

而不是导入实际的“Pocket Pixel Font”

我应该早点睡的...🤦u200d♂️

© www.soinside.com 2019 - 2024. All rights reserved.