【发布时间】: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%。
我基本上有两个期望:
- 当字体大小以“像素”为单位指定时,windows 分辨率对位图中的结果没有任何影响。对于相同的字体大小,它总是相同的,也与位图的分辨率无关。
- 当字体大小以“点”为单位指定,另外还明确设置了位图分辨率时,Windows 屏幕分辨率设置对位图中的结果没有任何影响。
但结果并没有达到我的预期。 1. 以“像素”为单位指定字体大小时,windows分辨率导致14px大小的结果不同,而10px、100px或200px则没有。 2. 当字体大小以“点”为单位指定时,明确设置位图分辨率没有任何效果。
直到现在我还没有找到任何解释。
谁能告诉我如何在位图中创建文本,总是看起来像 Windows 分辨率设置为 100%,即使不是?
提前谢谢你!
【问题讨论】:
标签: c# fonts resolution pixel font-size