我在c#中编写了一个imageHandler.ashx,它可以快速绘制文本图像。它采用参数字符串txt。处理程序从Asp.net页面调用。在调用时,如果文本包含字符@或任何特殊字符。不会创建@的图像,或者给它的任何特殊字符。
根据我的R& D,问题在于Graphics.DrawString()方法有些如何无法编写特殊字符。请告诉我如何创建特殊字符的图像 我正在使用的代码:
String signatureText = HttpUtility.HtmlDecode(signatureText);
System.Drawing.Text.PrivateFontCollection fontCollection = new System.Drawing.Text.PrivateFontCollection();
FontFamily ff1 = fontCollection.Families[0];
// Initialize graphics
RectangleF rectF = new RectangleF(0, 0, imgWidth, imgHeight);
Bitmap pic = new Bitmap((int) rectF.Width,imgHeight, PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(pic);
//g.SmoothingMode = SmoothingMode.Default;
// g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
Font font1 = new Font(ff1, imgHeight, FontStyle.Regular, GraphicsUnit.Pixel);
float bestFontSize = BestFontSize(g, new Size(imgWidth, imgHeight), font1, signatureText);
Font font2 = new Font(ff1, bestFontSize, FontStyle.Regular, GraphicsUnit.Pixel);
// Set colors
Color fontColor = Color.Black;
Color rectColor = Color.White;
SolidBrush fgBrush = new SolidBrush(fontColor);
SolidBrush bgBrush = new SolidBrush(rectColor);
// Rectangle or ellipse?
g.FillRectangle(bgBrush, rectF);
// Set font direction & alignment
StringFormat format = new StringFormat();
//format.FormatFlags = StringFormatFlags.DirectionRightToLeft;
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
// Finally, draw the font
g.DrawString(signatureText, font2, fgBrush, rectF, format);
pic = (Bitmap) ImageUtility.ResizeImageWithAspectRatio(pic, imgWidth, imgHeight, true);
pic.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
任何帮助都是提前感谢
答案 0 :(得分:2)
DrawString()在编写特殊字符时没有任何问题,如果它们是在字体文件(.ttf)中提供的那么
问题可以在以下一行
System.Drawing.Text.PrivateFontCollection fontCollection = new System.Drawing.Text.PrivateFontCollection();
特别使用ff1
中的字体FontFamily ff1 = fontCollection.Families[0];
在你的情况下,它意味着字体ff1没有部分或全部特殊字符的表示。
由于我不知道你从fontCollection.Families获得了多少字体文件,如果fontCollection.Families包含多个字体文件,请尝试下一个。
FontFamily ff1 = fontCollection.Families[1]; // and so on.
或尝试添加包含所有特殊字符的字体文件(如果绝对需要System.Drawing.Text.PrivateFontCollection)。
或者,您可以使用InstalledFontCollection而不是PrivateFontCollection
System.Drawing.Text.InstalledFontCollection fontCollection = new System.Drawing.Text.InstalledFontCollection();
这将通过其Families属性InstalledFontCollection为您提供运行应用程序的系统的所有已安装字体。
最简单的方法是(如果只需要一种字体,因为您在提供的代码中只使用一种字体) 使用FontFamily类的构造函数和字符串类型参数FontFamily。
考虑更换此行
FontFamily ff1 = fontCollection.Families[0];
有了这个
FontFamily fontFamily1 = new FontFamily("Arial");
必须在运行应用程序的系统上安装Arial。
希望这会有所帮助。
答案 1 :(得分:0)
DrawString在绘制@或版权等特殊字符方面没有任何问题(我刚测试过并生成了下图)。
问题可能来自您的网址参数。尝试在传递文本时使用Server.UrlEncode
对文本进行编码,然后在将其提供给DrawString之前使用Server.UrlDecode
。