Graphics.DrawString()
で平滑化とレンダリングのすべての組み合わせで文字列を描画しようとしていたので、文字レンダラーが文字列を描画するのに良い仕事をするだろうと思っていましたが、ASP.NET TextRenderer.DrawText厄介なテキストイメージ
これは、見えるようになっている方法です。
そして、これは、それがどのように見えるかです:私のコードです。ここ
:
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だ方法です。
これはGraphics.DrawString()
あなたが見ることができるように、それは本当にあまり良くないが、私は得た。私は、コードにいくつかの変更を行い、より大きなフォントで、より良い結果を得た:
これは、Arialフォント20ピクセルであることをsuposedだ方法です:
この結果、描画されます。
をここでは変更されたコードがあります(私は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;
は、白い背景に、これらの設定と、最終的なイメージは、次のとおりです。
全く同じ、提案や回答に感謝します。
イメージをどのようなグラフィック形式で表示していますか? –
フォーマットはPngなので、背景は透明です。私は現在、TextRendererを使用しているときには何も変わっていません。Graphics.DrawString agianに戻って結果は少し良くなりました。私は右のコンボを取得すると、agianを投稿します。 – formatc
GIFを使用しようとしていないことを確認するだけで、アルファチャンネルが失われ、同様の醜い結果が得られます。 –