4

Windowsフォームのすべてのフォントですべての文字列を表示できるため、少し混乱していますが、画像として常に表示できるとは限りません。たぶん私のコードに何か問題があります。しかし、私が何をしようとしていたかをお見せしましょう。

最初に私はこれを持っています:

    Label l = new Label();

    l.Text = "Ì CSharp Î";

    this.Font = new Font("Code 128", 80);

    l.Size = new System.Drawing.Size(300, 200);

    this.Controls.Add(l);
    this.Size = new Size(300, 200);

Windowsフォームの文字列+コード128フォント

さて、これは非常に問題ありません。次に、画像と同じフォントで同じ文字列を保存してみたいと思います。私はこのコードを見つけました、そして私はこれを行う方法だと思いました

        private static Image DrawText(string text, Font font, Color textColor, Color backColor)
        {
            //first, create a dummy bitmap just to get a graphics object
            Image img = new Bitmap(1, 1);
            Graphics drawing = Graphics.FromImage(img);

            //measure the string to see how big the image needs to be
            SizeF textSize = drawing.MeasureString(text, font);

            //free up the dummy image and old graphics object
            img.Dispose();
            drawing.Dispose();

            //create a new image of the right size
            img = new Bitmap((int)textSize.Width, (int)textSize.Height);

            drawing = Graphics.FromImage(img);

            //paint the background
            drawing.Clear(backColor);

            //create a brush for the text
            Brush textBrush = new SolidBrush(textColor);

            drawing.DrawString(text, font, textBrush, 0, 0);
            drawing.Save();
            textBrush.Dispose();
            drawing.Dispose();

            return img;
        }

        var i = DrawText("Ì CSharp Î", new Font("Code 128", 40), Color.Black, Color.White);

画像を保存すると、次のようになります。

ここに画像の説明を入力してください

理解できません。Windowsフォームで使用したのと同じ文字列と同じフォントを使用しています。どうしてこんなことに?そして、この問題を回避する方法は?

PS:私が使用しているフォントはここからダウンロードされましたが、他のフォントでもテストしたので、常に機能するとは限りませんでした。

4

3 に答える 3

3

まあ、これはかなり奇妙ですが、Labelがテキストを描画するために使用するのと同じコードを使用していません。Labelコントロールは、デフォルトでTextRenderer.DrawText()を使用します。これは、GDI関数(DrawTextEx)をピンボークする関数です。Graphic.DrawString()呼び出しは、根本的に異なるテキストレンダリングエンジンを使用するGDI+関数を呼び出します。レイアウトに問題があるため、TextRendererが.NET2.0に追加されました。

私は、これら2つの関数がフォントを異なる方法でマッピングしていることに気づいていません。しかし、誰が知っているか、これは正確に標準フォントではありません。代わりにTextRendererを使用してください。LabelのDrawToBitmap()メソッドは、フォールバックソリューションです。

于 2012-07-19T11:47:09.623 に答える
0

ダウンロードしたフォントが機能していないことがわかります。インストールしたフォントを作成したのと同じ作成者のこの異なるバージョンのフォントを試してください。最初に古いフォント「Code128」をc:\ windows \ fontsから削除してから、新しいフォントを同じフォルダにドラッグアンドドロップします。

于 2012-07-19T10:37:32.250 に答える
0

http://msdn.microsoft.com/en-us/library/164w6x6z.aspx

と述べています

familyNameパラメーターで、アプリケーションを実行しているマシンにインストールされていないフォント、またはサポートされていないフォントが指定されている場合、MicrosoftSansSerifが代用されます。

私はあなたがあなたが得るフォントがあなたnew Font("Code 128", 40)が指定した家族のものであることにあなた自身を満足させる必要があると思います。このコードを同じシステムで実行していますか?フォントはプログラムとともにローカルにインストールまたは保存されていますか?どちらの場合も、フォントは実際に使用できますか?

私はこれをテストしてみます:

Label l = new Label();
l.Text = "Ì CSharp Î";
this.Font = new Font("Code 128", 80);
l.Size = new System.Drawing.Size(300, 200);
this.Controls.Add(l);
this.Size = new Size(300, 200);
var i = DrawText(l.Text, this.Font, Color.Black, Color.White);

それでも結果が異なる場合は、うーん...それからもっと考える必要があります!

于 2012-07-19T10:40:54.637 に答える