无法创建特殊字符的图像

时间:2013-07-17 09:21:54

标签: asp.net c#-4.0 special-characters httphandler drawstring

我在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);

任何帮助都是提前感谢

2 个答案:

答案 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在绘制@或版权等特殊字符方面没有任何问题(我刚测试过并生成了下图)。

enter image description here

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