2012-01-27 9 views
7

Od czasu, gdy próbowałem narysować ciąg z każdą kombinacją wygładzania i renderowania z Graphics.DrawString(), myślałem, że renderer tekstowy wykona lepszą pracę rysując moje struny, ale myślę, że był błędny.ASP.NET TextRenderer.DrawText Straszne obrazy tekstowe

Jak to ma wyglądać:

enter image description here

I tak to wygląda:

enter image description here

Oto mój kod:

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); 

Czy mój PxtoEm metoda jest zła?

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

muszę kilka sugestii, bo to jest naprawdę straszne, to gorzej z większych czcionek i obrazy nie są skurczyła.

UPDATE: Got to praca z większych czcionek (np 20px.), Ale z mniejszymi czcionkami robi rodzaju usuwanych na niektórych listach:

To jak to suposed być czcionką Arial 10px:

enter image description here

to wynikać z Graphics.DrawString()

enter image description here

Jak widać, naprawdę nie jest zbyt dobrze, ale najbliżej. Zrobiłem kilka zmian w kodzie i jeszcze lepsze wyniki przy większej czcionki:

To jak to suposed być czcionką Arial 20 pikseli:

enter image description here

wynik ten rysunek:

enter image description here

A tutaj jest zmieniony kod (metoda I droped i używane bezpośrednio piksele, przełączane na Graphics.DrawString() zamiast TextRenderer.DrawText()

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); 

Jeśli ktoś ma jakąś sugestię, aby napisać inną metodę dla mniejszych rozmiarów tekstu i użyć powyższego kodu do większego, ponieważ działa dobrze, opublikuj go, a spróbuję!

UPDATE 3: Wreszcie znalazł rozwiązanie dla wszystkich, a rozwiązanie było dość proste: NIE UŻYWAĆ przezroczystym tłem!

i ustawienia są:

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; 

Oto ostateczny obraz z tych ustawień na białym tle:

enter image description here

Dokładnie to samo, dzięki za sugestie i odpowiedzi.

+0

W jakim formacie graficznym przesyłasz obraz jako? –

+0

Format jest Png, ponieważ tło i jest przezroczyste. Obecnie próbuję wszystkich innych sugerowanych poniżej do tej pory nic się nie zmieniło podczas korzystania z TextRenderer, zamiast tego wróciłem do Graphics.DrawString, a wyniki są nieco lepsze. Wezmę agian, gdy dostanę prawą kombinację. – formatc

+0

Fajnie, sprawdzam, aby upewnić się, że nie próbujesz używać GIF-a, ponieważ utraciłbyś kanał alfa i uzyskasz podobne brzydkie wyniki. –

Odpowiedz

2

zbudowałem coś do generowania obrazu za pomocą przycisków podobną funkcjonalność i miałem problemy z kerneling i czcionka nie rozciągająca się do pożądanego przez. Poniższe ustawienia bardzo zbliżyły mnie do tego, czego chciałem, ale nadal nie były w 100%.

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

Działa to, ale tylko dla większej czcionki (np. 20px), i tak najbliżej, jak do tej pory. Postaram się zagrać jeszcze trochę, aby sprawdzić, czy uda mi się uzyskać lepsze wyniki przy użyciu mniejszych czcionek. – formatc

0

Nie jestem pewien, czy to rozwiąże problem, ale miałem podobny problem z rysowaniem tekstu w Direct3D, sprawdź PixelOffsetMode, ustaw go na Half.

+0

Próbowałem, robi się brudny z większymi czcionkami i tym samym, co wysoka jakość na mniejszym. – formatc

2

Set Graphics.TextRenderingHint do SingleBitPerPixelGridFit.

3

nie jestem pewien, że to pomoże, ale dlaczego nie stworzyć czcionkę bez wywołania funkcji, takich jak to:

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

Pomogło to ułatwić, ale wciąż to samo, dzięki i tak przeoczyłem to. – formatc

+0

n.p. Nie sądziłem, że pomoże to w jakości renderingu, ale prostszy kod jest zawsze: D – Hogan