在位图中创建Windows设置(DPI)独立文本

时间:2013-11-19 13:31:33

标签: c# fonts resolution pixel font-size

我想知道是否可以在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. 当以“像素”为单位指定字体大小时,窗口分辨率对位图中的结果没有任何影响。对于相同的字体大小,它将始终相同,也与位图的分辨率无关。
  2. 当以“Point”为单位指定字体大小并且另外明确设置了位图分辨率时,Windows屏幕分辨率设置对位图中的结果没有任何影响。
  3. 但结果并不符合我的期望。  1.当以“像素”为单位指定字体大小时,窗口分辨率导致14px大小的不同结果,但不是10px,100px或200px。  2.当使用“Point”作为单位指定字体大小时,显式设置位图分辨率没有任何效果。

    到目前为止,我没有找到任何解释。

    任何人都可以告诉我如何在Bitmaps中创建Text,看起来Windows分辨率设置为100%,即使它不是?

    提前谢谢!

1 个答案:

答案 0 :(得分:0)

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