2012-05-31 12 views
6

私は、ビットマップにテキストを描画するには、次のコードを使用しています:GDI +を使用してテキストを描画するときに、正確なフォントサイズを定義することはできますか?

using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point)) 
{ 
    //draw the text 
    graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat); 
} 

それは素敵な作品。私はテキストを少し大きめにしたい

enter image description here

:ここでは、テキストレンダリングされます。私は、フォントサイズとして11を設定した場合は、ここで私が得るものです:それは私が欲しいもののためには大きすぎる

enter image description here

。 私は10.25,10.5などを試しましたが、10と同じ結果が得られます。GraphicsUnitからPixelに設定しようとしますが、カスタムフォントサイズを設定することはできません。ここで

は私の質問です:

GDI +(C#)を使用してテキストを描画するときは、レンダリングされたテキストの "微調整" サイズにpossiblityはありますか?


EDIT: より完全なコード・スニペット(要求される):

using (Bitmap bitmap = new Bitmap(width, height)) 
using (Graphics graphics = Graphics.FromImage(bitmap))  
using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point)) 
{ 
    graphics.SmoothingMode = SmoothingMode.AntiAlias; 
    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

    Rectangle rect = new Rectangle(0, 0, width, height); 

    //method 1 
    StringFormat stringFormat = new StringFormat(); 
    stringFormat.Alignment = StringAlignment.Center; 
    stringFormat.LineAlignment = StringAlignment.Center; 
    graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat); 

    //method 2 
    TextFormatFlags flags = TextFormatFlags.HorizontalCenter | 
     TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;  
    TextRenderer.DrawText(graphics, "Some text", font, rect, Color.White, flags); 

    bitmap.Save(stream, ImageFormat.Png);   
} 
+0

'TextRenderingHint.ClearTypeGridFit' – leppie

+0

を試し、私はgraphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFitを試みたが、それは私があなたの' StringFormat'が誤っている疑いがある – tigrou

+1

同じ結果を与えます。 IIRC、私は成功して 'FitBlackBox'を使用しました。実際には、非常に特定の高さ設定に基づいて、フォント幅を正確に整数に調整しました。 – leppie

答えて

3

は、私はC#や.NETライブラリを知らないが、、this pageを見て、TextRenderingHintためAntiAliasを選択すると、ヒンティングオフにし、アンチエイリアスをオンにする必要があることと思われます。これにより、より多くの中間サイズが得られますが、テキストがぼやけてしまう可能性があります。

問題はフォントヒントです。ストロークの幅やセリフのサイズのようなフォントの詳細がターゲットデバイスの解像度と同じ順序である場合、単にデザイン単位をデバイス単位にスケーリングすると、特にアンチエイリアス処理がない場合に、種類。

これを避けるため、ほとんどのフォントには、解像度が限定されている場合に四捨五入するための特別な場合のルールを示すヒントがあります。効果は、あなたがサイズの "階段"を見ることです。

この手順を回避するには、「ヒント」をオフにする必要があります。これにより、ラスタライザは特別な四捨五入規則を無視し、デザイン単位を直接デバイス単位にスケーリングします。これにより、真にリニアスケーリングテキストを作成することができます。トレードオフは、テキストが小さいサイズではよく見えないことがあるということです。アンチエイリアスは対称性を向上させることができますが、多くの人にとってはテキストがぼやけて見えることがあります。

4

Graphics.drawStringを()は、重度と解けない精度の問題を有し、それはプリンタのような高解像度のデバイスにのみ適しています。

.NET 2.0のTextRenderer.DrawText()メソッドを代わりに使用します。

+0

私は言及することを忘れています:コードはASP.NET 3.5アプリケーションで、.ashxサービスで使用されます。システムを使うのは安全ですか?Windows.Formsアセンブリ(デフォルトでは含まれていません)? – tigrou

+0

はい、問題ありません。 –

+1

私はTextRenderer.DrawText()メソッドを試しました。私の質問では最初の絵のようにフォントサイズ9.7がレンダリングされますが、9.8は2番目のレンダリングと同じです。基本的にはうまくいきません。設定するフラグ/オプションはありますか? GraphicsUnitをPixelとleppieの提案に設定しようとしましたが、運はありませんでした。 – tigrou

関連する問題