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ć:
I tak to wygląda:
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:
to wynikać z Graphics.DrawString()
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:
wynik ten rysunek:
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:
Dokładnie to samo, dzięki za sugestie i odpowiedzi.
W jakim formacie graficznym przesyłasz obraz jako? –
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
Fajnie, sprawdzam, aby upewnić się, że nie próbujesz używać GIF-a, ponieważ utraciłbyś kanał alfa i uzyskasz podobne brzydkie wyniki. –