2009-02-19 8 views
7

Ich versuche, Bilder auf einem C# -Formular (in PictureBoxen, sowie mit Graphics.DrawImage()) zu zeichnen, und bin auf der Suche nach einer Möglichkeit, sie glatt zeichnen. Die Bilder müssen ein Format sein, das Transparenz unterstützt, also PNG, GIF, SVG und WMF. C# unterstützt SVG-Dateien nicht von Anfang an, und ich habe keine gute Bibliothek von Drittanbietern gefunden (ich habe SvgNet gefunden, konnte es aber nicht herausfinden).Wie zeichne glatte Bilder mit C#?

Ich muss eine WMF-Datei zeichnen, die C# über die Funktion Image.FromFile() ausführen kann, aber es ist nicht anti-aliased. Ich habe mich gefragt, ob es irgendeinen Weg gibt, das auszugleichen?

Antwort

7

Wenn das Bild auf eine Leinwand zeichnen, können Sie den Interpolationsmodus etwas schöneren dann glatt verkleinerten Bilder zu machen nächste Nachbarn ändern:

Graphics g = ... 
g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
g.DrawImage(...); 

Sie werden System.Drawing.Drawing2D hinzufügen müssen, um bekommen die InterpolationMode-Enumeration.

Die Verwendung von PictureBox wird ein Problem sein - es stellt keine InterpolationMode-Eigenschaft, so müssen Sie Ihre eigene rollen oder herunterladen.

+0

Jede Idee, wo ich eine herunterladbare finden konnte, oder wie meine eigenen gehen zu tun? Ich bin ein Anfänger C# -Entwickler, und das Schreiben meiner eigenen könnte eine Aufgabe, die etwas über meine derzeitigen Fähigkeiten ist. –

+0

Als Anfänger die einfachste Möglichkeit zum Starten der Rolling-eigenen Klasse möglicherweise ein Panel-Steuerelement platzieren, und schreiben Sie dann sein Paint-Ereignis (im Eigenschaftenfenster, wählen Sie Ereignisse [das Blitzsymbol] und doppelklicken Sie neben dem Paint-Ereignis in der Liste). Verwenden Sie den e.Graphics-Parameter, um Ersatzzeichencode zu schreiben. – David

+0

Great Great Great ,,, Million Dank – bebosh

15

Die vorherigen Antworten, obwohl gut gemeint, waren nur teilweise richtig.

Was war richtig? PictureBox stellt InterpolationMode nicht bereit.

Was war von der Basis?

1) Sie können diese Eigenschaft im Paint-Ereignis problemlos über das Bildfeld im übergeordneten Element oder über eine Überschreibung in einer abgeleiteten Klasse festlegen. . . So oder so funktioniert es und beides ist genauso einfach. Wenn jedoch SmoothingMode nicht festgelegt ist, wird der Interpolationsmodus ignoriert. Sie erhalten kein Anti-Aliasing, wenn SmoothingMode auf SmoothingMode.AnitAlias ​​festgelegt ist.

2) Die Verwendung eines Panels, wenn Sie ein deutliches Interesse an der Verwendung der Funktionen von PictureBox bekundet haben, ist die falsche Richtung. Ihnen fehlt die Möglichkeit, Bilder direkt zu laden, zu speichern oder zuzuordnen, ohne diese Eigenschaften explizit zu codieren. . . Warum das Rad neu erfinden? Durch Ableiten von PictureBox erhalten Sie all das kostenlos.

Die Nachrichten werden noch besser, als ich die harte Arbeit für Sie getan habe und es dauerte weniger Zeit als das Schreiben dieser Nachricht.

Ich habe zwei Versionen zur Verfügung gestellt, die beide von PictureBox abgeleitet sind. Zuerst ist ein einfaches Beispiel, das immer die bestmögliche Wiedergabequalität verwendet. Dies ist auch das langsamste Rendering. Zweite ist eine Klasse, die es jedem erlaubt, die verschiedenen Rendering-Parameter über Eigenschaften der abgeleiteten Klasse einzustellen. Einmal eingestellt, werden diese im OnPaint Override verwendet.

public class HighQualitySmoothPictureBox : PictureBox 
{ 
    protected override void OnPaint(PaintEventArgs pe) 
    { 
     // This is the only line needed for anti-aliasing to be turned on. 
     pe.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 

     // the next two lines of code (not comments) are needed to get the highest 
     // possible quiality of anti-aliasing. Remove them if you want the image to render faster. 
     pe.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
     pe.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     // this line is needed for .net to draw the contents. 
     base.OnPaint(pe); 
    } 
} 

...

public class ConfigurableQualityPictureBox : PictureBox 
{ 
    // Note: the use of the "?" indicates the value type is "nullable." 
    // If the property is unset, it doesn't have a value, and therefore isn't 
    // used when the OnPaint method executes. 
    System.Drawing.Drawing2D.SmoothingMode? smoothingMode; 
    System.Drawing.Drawing2D.CompositingQuality? compositingQuality; 
    System.Drawing.Drawing2D.InterpolationMode? interpolationMode; 

    public System.Drawing.Drawing2D.SmoothingMode? SmoothingMode 
    { 
     get { return smoothingMode; } 
     set { smoothingMode = value; } 
    } 

    public System.Drawing.Drawing2D.CompositingQuality? CompositingQuality 
    { 
     get { return compositingQuality; } 
     set { compositingQuality = value; } 
    } 

    public System.Drawing.Drawing2D.InterpolationMode? InterpolationMode 
    { 
     get { return interpolationMode; } 
     set { interpolationMode = value; } 
    } 

    protected override void OnPaint(PaintEventArgs pe) 
    { 
     if (smoothingMode.HasValue) 
      pe.Graphics.SmoothingMode = smoothingMode.Value; 
     if (compositingQuality.HasValue) 
      pe.Graphics.CompositingQuality = compositingQuality.Value; 
     if (interpolationMode.HasValue) 
      pe.Graphics.InterpolationMode = interpolationMode.Value; 

     // this line is needed for .net to draw the contents. 
     base.OnPaint(pe); 
    } 
} 
+0

Eine sehr gute Antwort. Die einzige Sache, die ich hinzufügen würde, sind einige Attribute wie Browsable, ToolboxItem, Beschreibung und Kategorie, um dieses Steuerelement in VisualDesigner verwenden zu können. – 0xBADF00D

+2

@hichaeretaqua Danke für Ihre freundlichen Worte. Ich stimme zu, dass eine endgültige Implementierung diese Attribute benötigt. Ich finde jedoch, dass Dinge, die nicht direkt mit der Antwort zu tun haben, überladen sind und den Lernenden von der beabsichtigten Botschaft ablenken können. Deshalb habe ich sie nicht zur Verfügung gestellt. –