2012-01-27 18 views
7

Graphics.DrawString()で平滑化とレンダリングのすべての組み合わせで文字列を描画しようとしていたので、文字レンダラーが文字列を描画するのに良い仕事をするだろうと思っていましたが、ASP.NET TextRenderer.DrawText厄介なテキストイメージ

これは、見えるようになっている方法です。

enter image description here

そして、これは、それがどのように見えるかです:私のコードです。ここ

enter image description here

Graphics objGraphics2 = Graphics.FromImage(objBitmap); 

objGraphics2.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
objGraphics2.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
objGraphics2.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
objGraphics2.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear; 

Font textFont = new Font(textFontFamily, PxtoEm(textSize)); 

SolidBrush b = new SolidBrush(textColor); 

TextRenderer.DrawText(objGraphics2, textValue, textFont, new Rectangle(0, 0, Width, Height), textColor); 

私のですメソッドが間違っていますか?

public float PxtoEm(int px) 
{ 
     float em = (float)(Convert.ToDouble(Convert.ToDouble(px) * Convert.ToDouble(72)/Convert.ToDouble(objBitmap.HorizontalResolution))); 
     return em; 
} 

私はこれは本当にひどいですので、いくつかの提案は、それが大きなフォントで悪化すると画像が縮小されていない必要があります。

UPDATE:それは大きなフォント(。つまり、20ピクセル)で作業を得たが、小さいフォントで、それは一種のいくつかの文字に消去されます:

は、これはArialフォント10pxのと一緒にsuposedだ方法です。

enter image description here

これはGraphics.DrawString()

enter image description here

と結果であり、

あなたが見ることができるように、それは本当にあまり良くないが、私は得た。私は、コードにいくつかの変更を行い、より大きなフォントで、より良い結果を得た:

これは、Arialフォント20ピクセルであることをsuposedだ方法です:

enter image description here

この結果、描画されます。

enter image description here

ここでは変更されたコードがあります(私はemメソッドを削除し、直接ピクセルを使用し、TextRenderer.DrawText()の代わりにGraphics.DrawString()に切り替えました

Graphics objGraphics = Graphics.FromImage(objBitmap); 
    objGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
    objGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; 
    objGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
    objGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
    objGraphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
    Font textFont = new Font(textFontFamily, textSize,GraphicsUnit.Pixel); 
    SolidBrush b = new SolidBrush(textColor); 
    PointF origin = new PointF((float)TextLeft,(float)TextTop); 
    StringFormat format = StringFormat.GenericTypographic; 

    objGraphics.DrawString(textValue, textFont, b , origin, format); 

誰かが多分小さいテキストサイズの異なる方法を書いて、それがうまく動作として大きなためのコード上で使用するためのいくつかの提案を持っている場合は、それを投稿し、私はそれを試してみましょう!

更新3:最後にすべてのソリューションが見つかりましたが、解決方法は単純でした。 透明な背景を使用しないでください!

と設定は以下のとおりです。ここで

objGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
objGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; // <-- important! 
objGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
objGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
objGraphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
      objGraphics.TextContrast = 0; 

は、白い背景に、これらの設定と、最終的なイメージは、次のとおりです。

enter image description here

全く同じ、提案や回答に感謝します。

+0

イメージをどのようなグラフィック形式で表示していますか? –

+0

フォーマットはPngなので、背景は透明です。私は現在、TextRendererを使用しているときには何も変わっていません。Graphics.DrawString agianに戻って結果は少し良くなりました。私は右のコンボを取得すると、agianを投稿します。 – formatc

+0

GIFを使用しようとしていないことを確認するだけで、アルファチャンネルが失われ、同様の醜い結果が得られます。 –

答えて

2

私は同様の機能を使用してイメージボタンを生成するために何かを構築し、私はkernelingの問題を持っていたし、フォントは望み通りに伸びない。以下の設定は、私が望むものに本当に近いが、まだ100%ではない。

objGraphics2.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
objGraphics2.TextRenderingHint = System.Drawing.Drawing2D.TextRenderingHint.AntiAliasGridFit; 
+0

これは動作していますが、それはもっと大きなフォント(すなわち20px)より小さなフォントでより良い結果を得ることができるかどうかを調べるために、もう少し試してみようと思います。 – formatc

0

これで問題が解決するかどうかわかりませんが、Direct3Dでテキストを描画するときに同様の問題がありました。PixelOffsetModeをチェックし、Halfに設定してください。

+0

私は試してみましたが、より大きなフォントでは乱雑ですし、小さくてもHighQualityと同じです。 – formatc

2

セットGraphics.TextRenderingHint~SingleBitPerPixelGridFit

3

私はそれが役立つか分からないが、なぜ関数の呼び出しなしで、あなたのフォントを作成しないで、次のように:

Font textFont = new Font(textFontFamily, textSize, GraphicsUnit.Pixel); 
+0

これは、同じことをやりやすくするのに役立ちましたが、とにかく私はこれを見落としました。 – formatc

+0

n.p.私はそれがレンダリングの質に役立つとは思っていませんでしたが、よりシンプルなコードは常にです:D – Hogan

関連する問題