我有一个很好的问题。我搜索了所有Google和MSDN,但没有找到任何内容。
我正在尝试将字体导出为每个字符的单个PNG图像。我目前正在使用新的Windows字体 Segoe UI Symbol 对其进行测试。请注意我知道字体许可条款,我不会在互联网上分发该字体。
嗯,当我调用方法DrawString
,Graphics
的成员时,真正的问题就出现了。我将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);
}
}
答案 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)。