2012-01-27 3 views
7

부드럽게하고 렌더링하는 모든 조합을 사용하여 문자열을 그려 넣으려고 했으므로 텍스트 렌더러가 내 문자열을 그리는 것이 더 효과적 일 것이라고 생각했지만 틀렸다고 생각했습니다.ASP.NET TextRenderer.DrawText 끔찍한 텍스트 이미지

이 그것이 다워야 방법입니다 :

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); 
: 여기

enter image description here

내 코드입니다

내입니다.방법이 잘못 되었나요?

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

나는이 정말 끔찍하기 때문에 몇 가지 제안, 그것은 더 큰 글꼴 악화와 이미지가 축소되지 않습니다해야합니다.

UPDATE :

이이 글꼴 굴림 10px로해야되는 거지 어떻게입니다 :

는하지만 종류의 어떤 문자에 삭제됩니다 작은 글꼴 더 큰 글꼴 (. 즉, 20 픽셀) 작업을 당함

enter image description here

Graphics.DrawString()

enter image description here

,369과 결과

당신이 볼 수 있듯이 정말 좋지는 않지만 가까이에 있습니다. 나는 코드의 일부를 변경했고 더 큰 글꼴과 함께 더 나은 결과를 얻었다 :

enter image description here

이 받고있다 결과 :

enter image description here

이이 글꼴이 Arial 20 픽셀로해야되는 거지 어떻게입니다

그리고 여기에 변경된 코드가 있습니다 (나는 방법을 삭제하고 직접 픽셀을 사용하고 TextRenderer.DrawText() 대신 Graphics.DrawString()으로 전환했습니다

누군가가 작은 텍스트 크기에 대해 다른 방법을 쓰고 위의 코드를 더 잘 작동하도록 멋지게 사용할 수있는 의견이 있으면 게시하고 시도해 보겠습니다.

업데이트 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

및 글꼴은 원하는대로 늘어나지 않습니다. 다음 설정은 내가 원했던 것과 거의 비슷하지만 여전히 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

이 같은, 그것은 도움이 될 것입니다 모르겠지만 왜 함수 호출없이 글꼴을 만들 수 없습니다 :

나는 비슷한 기능을 사용하여 이미지 버튼을 생성하는 무언가를 구축하고 내가 kerneling 문제를 가지고
Font textFont = new Font(textFontFamily, textSize, GraphicsUnit.Pixel); 
+0

이것은 쉽게 더 쉽게 만들 수있었습니다. 어쨌든 저는 이것을 간과했습니다. – formatc

+0

n.p. 나는 렌더링 품질에 도움이 될 것이라고 생각하지 않았지만 단순한 코드는 항상 다음과 같습니다. D – Hogan

관련 문제