我有一个项目,其中创建的图像带有围绕不可见圆旋转的文本。
图形本身运行正常。但是,看来无论我使用哪种字体,我总是会得到相同的结果,这是我假设某些低质量的默认字体。
这是代码:
Bitmap objBmpImage = new Bitmap(1000, 1000);
System.Drawing.Text.InstalledFontCollection installedFontCollection = new System.Drawing.Text.InstalledFontCollection();
FontFamily[] fontFamilies = installedFontCollection.Families;
System.Drawing.Font objFont = new System.Drawing.Font(fontFamilies.Where(x => x.Name == "Arial").FirstOrDefault(),10);
Graphics objGraphics = Graphics.FromImage(objBmpImage);
objGraphics.Clear(Color.Transparent);
float angle = (float)360.0 / (float)competences.Count();
objGraphics.TranslateTransform(500, 450);
objGraphics.RotateTransform(-90 - (angle / 3));
int nbComptetence = competences.Count();
int indexCompetence = 0;
foreach (T_Ref_Competence competence in competences)
{
byte r, g, b;
HexToInt(competence.T_Ref_CompetenceNiveau2.T_Ref_CompetenceNiveau1.Couleur, out r, out g, out b);
Brush brush = new System.Drawing.SolidBrush(Color.FromArgb(255,r,g,b));
if (indexCompetence * 2 < nbComptetence)
{
objGraphics.DrawString(competence.Nom, objFont, brush, 255, 0);
objGraphics.RotateTransform(angle);
}
else
{
objGraphics.RotateTransform(180);
objGraphics.RotateTransform(angle/2);
float textSize = objGraphics.MeasureString(competence.Nom, objFont).Width;
objGraphics.DrawString(competence.Nom, objFont, brush, -253 - textSize, 0);
objGraphics.RotateTransform(angle);
objGraphics.RotateTransform(-180);
objGraphics.RotateTransform(-angle / 2);
}
indexCompetence++;
}
我使用已安装的系列来获取字体
System.Drawing.Text.InstalledFontCollection installedFontCollection = new System.Drawing.Text.InstalledFontCollection();
FontFamily[] fontFamilies = installedFontCollection.Families;
System.Drawing.Font objFont = new System.Drawing.Font(fontFamilies.Where(x => x.Name == "Arial").FirstOrDefault(),10);
我尝试使用其他字体,但结果始终相同。 我想念什么吗?如果没有,那可能是什么原因?
谢谢
编辑:要回答这个问题,我到底想要什么,请考虑以下问题:
此图像是我正在制作的网站的屏幕截图。中间的图表是使用Charts.js生成的,但是它的局限性迫使我将文本绘制为背景图像。实际上,它占用了我的大部分屏幕,因此无法真正做到比这更大。如您所见,文本字体非常模糊,我只是希望它更易于阅读。我虽然是字体的问题,但我真的不知道。
我对C#的整个图像绘制部分不是很熟悉,因此,如果有更好的方法来绘制文本(可以根据许多变量而改变),我会很乐于尝试其他事情。
答案 0 :(得分:2)
objGraphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel
objGraphics.InterpolationMode=InterpolationMode.NearestNeighbor;
如果缩放输入图像,然后以更高的DPI绘制文本,则将获得最佳效果。
位图的默认DPI为96。可能是使用该设置导出的JS库。
如果要更平滑地呈现字体,则需要增加DPI,例如
objBmpImage.SetResolution(1200,1200);
如果这样做,则可能需要增加位图的像素数。
如果“丑陋”文本仅适合1000x1000图片,则您现在需要1000 * 1200/96 = 12500像素。
更改前(使用Arial 10分):
更改后(仍然使用Arial 10 pt):
请注意,以厘米为单位的大小不变。因此它仍然可以很好地打印。