调用方法DrawString时,字符看起来像白框

时间:2012-06-21 04:37:11

标签: c# .net gdi

我有一个很好的问题。我搜索了所有Google和MSDN,但没有找到任何内容。

我正在尝试将字体导出为每个字符的单个PNG图像。我目前正在使用新的Windows字体 Segoe UI Symbol 对其进行测试。请注意我知道字体许可条款,我不会在互联网上分发该字体。

嗯,当我调用方法DrawStringGraphics的成员时,真正的问题就出现了。我将unicode整数值转换为char然后转换为字符串。我已经尝试使用char.ConvertFromUtf32()Convert.ToChar()将整数转换为char。

该程序在26个字符(从 57344 = 0xE000 开始)中运行良好,当我使用数值直到时,问题不会出现57370 即可。在此之后,没有一个数字没有用白盒字符写。

经过一些搜索后,我发现了Font构造函数的重载,其属性为gdiCharset,并尝试将其值设为2,但没有发生任何事情。

我在下面显示了您的源代码。如果有人可以帮助我,我会很高兴。

更新 当我使用转义序列(如"\uE1FF"而不是char转换时,它可以工作!但我不知道如何在for循环中创建转义序列。

        Font segoe = new Font("Segoe UI Symbol", 800, FontStyle.Regular, GraphicsUnit.Pixel, 2);

        Bitmap bmedidor = new Bitmap(1000, 1000, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        Graphics gmedidor = Graphics.FromImage(bmedidor);
        // This line below doesn't matter, see the method DrawString
        Size tamanho = gmedidor.MeasureString(char.ConvertFromUtf32(57344).ToString(), segoe).ToSize();

        int[] reducoes = new int[6] {512, 256, 128, 64, 32, 16};
        string caminho = "C:\\InoMetro";


        for (int u = 57344; u < 57896; u++)
        {
            Bitmap caractere = new Bitmap(tamanho.Width, tamanho.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            Graphics criador = Graphics.FromImage(caractere);

            criador.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            criador.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            criador.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            criador.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            // Here we have the problem
            criador.DrawString(Convert.ToChar(u).ToString(), segoe, new SolidBrush(Color.Black), new PointF(0, 0));

            for (int r = 0; r < reducoes.Length; r++)
            {
                int taR = reducoes[r];

                Bitmap reducao = new Bitmap(taR, taR, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                Graphics redutor = Graphics.FromImage(reducao);

                redutor.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                redutor.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
                redutor.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                redutor.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

                redutor.DrawImage(caractere, 0, 0, taR, taR);
                reducao.Save(caminho + "\\" + taR.ToString() + "\\" + u.ToString() + ".png", System.Drawing.Imaging.ImageFormat.Png);

            }

        }

1 个答案:

答案 0 :(得分:4)

U + E000-U + F8FF(十进制57344-63743)为Private Use Area characters

大多数字体(包括Segoe UI符号)不为此范围内的任何代码点提供字形,因此典型的后备行为是字体渲染器在黑色菱形中显示白框()或问号( )当被要求绘制其中一个代码点时。

Windows 8上的Segoe UI符号仅定义U + E000-U + E019的字形,然后不为U + E01A-U + E051提供字形;这就是为什么白盒显示为57370(0xE01A)到57425(0xE051)。

相关问题