TextRenderer.DrawText im Bitmap-vs OnPaintBackground
Wenn ich TextRenderer.DrawText() mit dem Graphics-Objekt zur Verfügung gestellt, in das OnPaintBackground mein text sieht perfekt aus. Wenn ich meine eigene Bitmap und verwenden Sie die Graphics-Objekt erhalten Sie von meinem Bitmap-mein text sieht schrecklich aus. Es sieht aus wie es ist mit anti-aliasing text mit schwarzen, nicht die bitmap-hintergrund-Farbe. Ich kann dieses problem vermeiden, wenn ich Grafiken verwenden.DrawString(), aber diese Methode hat schreckliche kerning-Probleme. Was soll ich tun? Wie bekomme ich TextRenderer.DrawText ( ... ), um anti-alias richtig mit der Bitmap der Inhalt?
Sieht schrecklich aus:
Bitmap bmp = new Bitmap(100, 100, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(bmp))
{
g.Clear(Color.Red);
TextFormatFlags tf = TextFormatFlags.Left;
TextRenderer.DrawText(g, @"C:\Development\Testing\blag", font, clip, Color.White, Color.Transparent, tf);
}
Sieht gut aus, aber ich will machen das auf eine bitmap, NICHT auf der Oberfläche des Steuerelements:
protected override void OnPaintBackground(PaintEventArgs e)
{
e.Graphics.Clear(Color.Red);
TextFormatFlags tf = TextFormatFlags.Left;
TextRenderer.DrawText(e.Graphics, @"C:\Development\Testing\blag", font, clip, Color.White, Color.Transparent, tf);
}
Was ist der Unterschied?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort ist nicht zu verwenden
TextRenderer
. TextRenderer-ist ein wrapper für die GDI (kein GDI+) Umsetzung des text-rendering, das hat viele Funktionen, aber nicht gut zusammenarbeiten mit in-memory-DCs, wie Sie entdeckt haben.Verwenden
Graphics.DrawString
&Graphics.MeasureString
, aber denken Sie daran, um es zu übergeben StringFormat.GenericTypographic um die genaue Größe und Positionierung.Den Grund TextRenderer eingeführt wurde, war zunächst, dass GDI+ nicht unterstützt all die komplexen Skripten, die die GDI-Uniscribe Motor hat. Im Laufe der Zeit jedoch GDI+ support für komplexe Skripte erweitert wurde, und in diesen Tagen, es gibt keine guten Gründe, die linke zu verwenden TextRenderer (es ist nicht einmal der schnellere der beiden mehr, ganz im Gegenteil es scheint).
Wirklich, obwohl, es sei denn, Sie läuft in einen schweren, messbare performance-Probleme, benutzen Sie einfach
Graphics.DrawString
.TextRenderer faster
?? Sind Sie sicher? Dieser Artikel sagte, es ist langsamer als GDI+ : theartofdev.com/2014/04/21/...DrawString
viel schneller auf meine Maschine zu.Ich glaube das problem ist, dass die clear-type-text-rendering nicht funktioniert, wenn der hintergrund transparent ist. Ein paar mögliche Lösungen.
Option 1. Füllen Sie den hintergrund des bitmap mit der Farbe.
Wenn Sie dies tun (als Tim Robinson hat oben in seinem code Beispiel durch die Verwendung von g.Clear(Color.Rot)) klar Typ wird das richtige tun. Aber die bitmap wird nicht vollständig transparent, die möglicherweise nicht akzeptabel sein. Wenn Sie Grafiken.MeasureText, können Sie füllen Sie einfach das Rechteck um Ihren text, wenn Sie mögen.
Option 2. Set TextRenderingHint = TextRenderingHintAntiAliasGridFit
Erscheint, deaktivieren Sie ClearType. Der text gerendert wird mit einer niedrigeren Qualität als klar Text auf einem hintergrund, aber viel besser als das Durcheinander klar Typ auf kein hintergrund erstellt.
Option 3. Füllen Sie den text ein Rechteck mit weiß, ziehen Sie den text und dann finden Sie alle nicht-text-Pixel und setzen Sie diese wieder transparent.
Ich weiß, es ist eine schreckliche hack, aber es scheint zu funktionieren.
Die Antwort ist die Verwendung eine
BuffersGraphicsContext
. Dies ist das gleiche system .NET intern verwendet, wenn Sie dieControlStyles.OptimizedDoubleBuffer
Stil auf ein Steuerelement.Sehen http://msdn.microsoft.com/en-us/library/b367a457.aspx für mehr Informationen über Doppel-Pufferung .NET.
Andere mögliche Lösung: Zeichnen Sie das ganze auf dem Bildschirm, bitmap mit text auf die Oberseite, und dann schreiben einige code 'screen capture', die Teil des Bildschirms. Praktisch nicht in allen Fällen, aber du hast Recht, Kordelzug erstellt seltsame Texte und DrawText auf ein bitmap sieht schrecklich aus.
Wenn Ihr bitmap ist nicht die gleiche Größe wie Ihre display-Bereich, es könnte nur sein, eine Größenänderung Frage, wo .NETTO-Waage wird die bitmap auf die Größe der Anzeige und Sie bekommen komisch aussehenden text.
Können Sie einen test mit einer bitmap erstellt in der gleichen Größe wie Ihre display-Bereich?
Können Sie nach dem kleinsten Programm, der leidet unter diesem problem? Ich kann es nicht reproduzieren wie diese-die antialiasing sieht gut aus: