在位图中创建与Windows设置(DPI)无关的文本。

3
我想知道在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分辨率会导致14像素大小的不同结果,但对于10像素、100像素或200像素则没有影响。 2. 当字体大小使用“点”作为单位时,显式设置位图分辨率也没有任何效果。
到目前为止,我还没有找到任何解释。
请问有谁能告诉我如何创建文本位图,使其始终看起来像Windows分辨率设置为100%,即使实际上不是这样吗?
提前感谢您!
1个回答

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接