我想知道是否可以在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.当以“像素”为单位指定字体大小时,窗口分辨率导致14px大小的不同结果,但不是10px,100px或200px。 2.当使用“Point”作为单位指定字体大小时,显式设置位图分辨率没有任何效果。
到目前为止,我没有找到任何解释。
任何人都可以告诉我如何在Bitmaps中创建Text,看起来Windows分辨率设置为100%,即使它不是?
提前谢谢!
答案 0 :(得分:0)
查看Win32 API LogFont结构和lfHeight成员,了解Windows如何满足您的身高要求。基本上你会想要使用那里给出的等式和恒定的DPI。您正在指定屏幕设备上下文,因此当您从100%更改为125%等时,屏幕的DPI正在发生变化,并影响Windows字体映射器返回的字体大小。