2

我在 c# 中编写了一个 imageHandler.ashx,它可以快速绘制文本图像。它接受一个参数字符串 txt。处理程序是从 Asp.net 页面调用的。在调用时,如果文本中包含字符@或任何特殊字符。它不会创建@的图像,或任何特殊字符的赋予它。

根据我的研发,问题出在 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);

任何帮助表示感谢在此先感谢

4

2 回答 2

2

如果字体文件 (.ttf) 中提供了特殊字符,则 DrawString() 在写入特殊字符时没有任何问题

问题可能在以下行

System.Drawing.Text.PrivateFontCollection fontCollection = new System.Drawing.Text.PrivateFontCollection();

特别是您在 ff1 中获得的字体

FontFamily ff1 = fontCollection.Families[0];

在您的情况下,这意味着 Font 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 必须安装在运行应用程序的系统上。

希望这会有所帮助。

于 2013-07-18T06:45:23.523 回答
0

DrawString 在绘制 @ 或版权等特殊字符时没有任何问题(我只是对其进行了测试并生成了下图)。

在此处输入图像描述

问题可能来自您的 URL 参数。尝试Server.UrlEncode在传递文本时使用对文本进行编码,然后Server.UrlDecode在将其提供给 DrawString 之前。

于 2013-07-17T09:41:08.223 回答