2

テキストの画像をオンザフライで描画する imageHandler.ashx を c# で作成しました。パラメータ文字列 txt を取ります。Handler は Asp.net ページから呼び出されます。呼び出し時に、テキストに文字 @ または任意の特殊文字が含まれている場合、.it は @ またはそれに与えられた特殊文字のイメージを作成しません。

私の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);

事前に感謝します

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 が絶対に必要な場合)。

または、PrivateFontCollection の代わりに InstalledFontCollection を使用できます。

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

これにより、アプリケーションが実行されているシステムのすべてのインストール済みフォントが Families プロパティInstalledFontCollectionを通じて提供されます。

最も簡単な方法は、文字列型パラメーターFontFamilyで FontFamily クラスのコンストラクターを使用することです (提供されたコードで 1 つのフォントのみを使用しているため、1 つのフォントのみが必要な場合) 。

この行を置き換えることを検討してください

FontFamily ff1 = fontCollection.Families[0];

こいつで

FontFamily fontFamily1 = new FontFamily("Arial");

アプリケーションが実行されているシステムに Arial をインストールする必要があります。

これが役立つことを願っています。

于 2013-07-18T06:45:23.523 に答える
0

DrawString は、@ や copyright などの特殊文字の描画に問題はありません (テストして下の画像を作成しました)。

ここに画像の説明を入力

問題は URL パラメーターにある可能性があります。Server.UrlEncodeテキストを渡すときに使用してテキストをエンコードしてServer.UrlDecodeから、それを DrawString に渡す前に試してください。

于 2013-07-17T09:41:08.223 に答える