【问题标题】:Create Windows settings (DPI) independent text in Bitmaps在位图中创建独立于 Windows 设置 (DPI) 的文本
【发布时间】:2013-12-03 02:02:22
【问题描述】:

我想知道是否可以在 C# (.NET 4.0) 中创建包含文本的位图,其中文本完全独立于任何 Windows 配置或设置。

我在这个问题上尝试了数周,但并没有真正找到解决方案。 为了调查事实,我在 VS2010 中创建了一个包含以下代码的小型控制台应用程序:

class Program
{
    private const TextFormatFlags DefaultTextFormatFlags = TextFormatFlags.NoPadding | TextFormatFlags.Left | TextFormatFlags.NoPrefix;

    private static int[] aPpi = { 72, 96, 192 };
    private static bool[] aSetPpi = { false, true };
    private static GraphicsUnit[] aGU = { GraphicsUnit.Pixel, GraphicsUnit.Point };
    private static int[] aSize = { 10, 14, 100, 200 };

    static void Main(string[] args)
    {
        int idx = 0;

        foreach (int ppi in aPpi)
        {
            foreach (bool b in aSetPpi)
            {
                foreach (GraphicsUnit gu in aGU)
                {
                    foreach (int size in aSize)
                    {
                        idx++;
                        CreatePic(idx, ppi, b, gu, size);
                    }
                }
            }
        }
    }

    private static void CreatePic(int id, int ppi, bool setppi, GraphicsUnit unit, int size)
    {
        Bitmap bm;

        Graphics g;
        Font font;
        Color txtColor;
        Color background;
        string fn;

        txtColor = Color.Blue;
        background = Color.Transparent;

        bm = new Bitmap(1000, 1000,  PixelFormat.Format32bppArgb);

        if (setppi)
        {
            bm.SetResolution(ppi, ppi);
        }

        g = Graphics.FromImage(bm);
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
        g.PageUnit = GraphicsUnit.Pixel;

        font = new Font("Roboto Lt", size, FontStyle.Regular, unit);

        TextRenderer.DrawText(g, "0T1ÄgÁj", font, new Point(0, 0), txtColor, background, DefaultTextFormatFlags);

        font.Dispose();

        g.Dispose();

        fn = string.Format("p_{0,-5}_{1,-4}_{2,-4}_{3,-4}.png", unit, size, setppi, ppi);
        bm.Save(fn, ImageFormat.Png);
        bm.Dispose();
    }
}

它会创建 PNG 文件,每个文件都包含一个测试文本,其中包含字体大小、位图分辨率和字体大小单位的几种组合。 起初我在 Windows 设置为正常字体大小(屏幕分辨率设置为 100%)时执行它,第二次运行时屏幕分辨率设置为 125%。

我基本上有两个期望:

  1. 当字体大小以“像素”为单位指定时,windows 分辨率对位图中的结果没有任何影响。对于相同的字体大小,它总是相同的,也与位图的分辨率无关。
  2. 当字体大小以“点”为单位指定,另外还明确设置了位图分辨率时,Windows 屏幕分辨率设置对位图中的结果没有任何影响。

但结果并没有达到我的预期。 1. 以“像素”为单位指定字体大小时,windows分辨率导致14px大小的结果不同,而10px、100px或200px则没有。 2. 当字体大小以“点”为单位指定时,明确设置位图分辨率没有任何效果。

直到现在我还没有找到任何解释。

谁能告诉我如何在位图中创建文本,总是看起来像 Windows 分辨率设置为 100%,即使不是?

提前谢谢你!

【问题讨论】:

    标签: c# fonts resolution pixel font-size


    【解决方案1】:

    查看 Win32 API LogFont 结构和 lfHeight 成员,了解 Windows 如何满足您的高度请求。基本上你会想要使用那里给出的方程和一个恒定的 DPI。您正在指定屏幕设备上下文,因此当您从 100% 更改为 125% 等时。屏幕的 DPI 正在更改并影响 Windows 字体映射器返回的字体大小。

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多