DOBON.NET DOBON.NETプログラミング掲示板過去ログ

文字の描画

  • 題名: 文字の描画
  • 著者: まりもん
  • 日時: 2013/02/03 13:48:37
  • ID: 31303
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[Windows7 .NET Framework3.5]
分類:[.NET]

2013/02/03(Sun) 19:24:45 編集(投稿者)
2013/02/03(Sun) 19:24:40 編集(投稿者)
2013/02/03(Sun) 19:24:07 編集(投稿者)

文字の描画で悩んでいます。
下記のソースで描画した時、
自分では、ImageAは伸縮も行われず、見た目は同じになるのではないかと
考えているのですが、フォントによっては描画される文字の見た目が違うのです。
(メイリオで描画した時、ImageAのほうは、太字になったように見えます)

e.Graphicsとgをイミディエイトウインドウにて確認しましたが、
DPI等は同じでした。
同じように見えるよう描画するには、どうしたらいいのでしょうか?

−−−−−−−−−−−−−以下ソース−−−−−−−−−−−−−

    Private Sub Form1_Paint(ByVal sender As Object, _
                ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim stringFormat As New StringFormat()
        Dim ImageA As New Bitmap(80, 80)
        Dim g As Graphics
        Dim DrawRect As New Rectangle(0, 0, 80, 80)
        Dim DrawFont As New Font("Meiryo UI", 12)

        stringFormat.Alignment = StringAlignment.Near
        stringFormat.LineAlignment = StringAlignment.Near

        e.Graphics.DrawString("ボタン0", DrawFont, _
                New SolidBrush(Me.ForeColor), DrawRect, stringFormat)

        g = Graphics.FromImage(ImageA)
        g.DrawString("ボタン0", DrawFont, _
                New SolidBrush(Me.ForeColor), DrawRect, stringFormat)
        e.Graphics.DrawImage(ImageA, 0, 100)
        g.Dispose()

    End Sub
添付ファイル: result.png (19 KB)
  • 題名: Re[1]: 文字の描画
  • 著者: Azulean
  • 日時: 2013/02/03 22:52:34
  • ID: 31304
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
g.TextRenderingHint = TextRenderingHint.AntiAlias あたりでしょうか。
なぜ同じ SystemDefault なのに挙動が違うのかまでは追っていませんが。
> g.TextRenderingHint = TextRenderingHint.AntiAlias あたりでしょうか。
> なぜ同じ SystemDefault なのに挙動が違うのかまでは追っていませんが。

Image側でTextRenderingHintをいろいろ指定してみましたが、同じにはなりませんでした。
e.Graphics、Image側ともにTextRenderingHintに同じ値(SystemDefault以外)を指定すると
同一の描画になりました。

ただ、AntiAliasを指定した場合でも、SystemDefault時より太く描画されるようです。

上記ソースは検証用として掲載しましたが、実際にはコントロール描画に利用したいので
他コントロールとの兼ね合いもあり、SystemDefault時に同じ描画にしたいのです。
■No31305に返信(まりもんさんの記事)

実際の使い方によりますが
以下のようにTranslateするのは駄目ですか?

    Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim stringFormat As New StringFormat()
        Dim DrawRect As New Rectangle(0, 0, 80, 80)
        Dim DrawFont As New Font("Meiryo UI", 12)
        Dim g As Graphics = e.Graphics

        stringFormat.Alignment = StringAlignment.Near
        stringFormat.LineAlignment = StringAlignment.Near

        g.DrawString("ボタン0", DrawFont, _
                New SolidBrush(Me.ForeColor), DrawRect, stringFormat)

        g.TranslateTransform(0, 100)
        g.DrawString("ボタン0", DrawFont, _
                New SolidBrush(Me.ForeColor), DrawRect, stringFormat)
        g.ResetTransform()

    End Sub
ご返答ありがとうございます。

ただ、実現したいことが、2か所に同じ文字を描画することではないためTranslateでは
回避できないと思います。
私のサンプルと説明が悪い為、伝わりにくい部分があったと思います。
サンプルでは、比較の為に2か所に文字を描画しました。
実現したいことは、サンプルの上に描画した文字と同じ描画をImageに描画したいのです。


また、いろいろ実験した結果、以下のことが分かりました。

    g = Graphics.FromImage(ImageA)
    g.FillRectangle(New SolidBrush(Me.BackColor), DrawRect)
    g.DrawString("ボタン0", DrawFont, _
                New SolidBrush(Me.ForeColor), DrawRect, stringFormat)

とテキストの描画前に、塗りつぶしを実行すると、同一に描画されました。
ただ、Color.Transparentで塗りつぶしても効果はありませんでした。
■No31307に返信(まりもんさんの記事)

ClearType フォントは、背景が不透明でない場合は正しく描画されなかったかと思います。
勝手に ClearType を無効にされたような気が。
# あまり自信ないのですが...

.NET の問題ではないような気がします。
  • 題名: Re[6]: 文字の描画
  • 著者: まりもん
  • 日時: 2013/02/04 20:33:44
  • ID: 31309
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> ClearType フォントは、背景が不透明でない場合は正しく描画されなかったかと思います。
> 勝手に ClearType を無効にされたような気が。
> # あまり自信ないのですが...
>
> .NET の問題ではないような気がします。

ClearTypeフォントについてちょっと検索してみましたが、背景が透明な時に
アンチエイリアスがかからないような描画がされるみたいですね。
知りませんでした。

ロジックを見直し、背景がある画像に文字を描画するように変更しようと思います。

ご返答頂いた方々、ありがとうございました。
これにて解決済みにします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板