Laden...

[Snippet] Bild beim Zeichnen invertieren

Erstellt von herbivore vor 16 Jahren Letzter Beitrag vor 10 Jahren 8.621 Views
herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 16 Jahren
[Snippet] Bild beim Zeichnen invertieren

Beschreibung:

Weil ich das Problem auch gerade hatte und eine Weile nach der Lösung suchen musste und nicht alle Lösungen, die im Netz angeboten werden, in allen Fällen funktionieren, hier mal eine ColorMatrix, die mit allen Farben korrekt funktioniert.

ImageAttributes ia = new ImageAttributes ();
ColorMatrix cm = new ColorMatrix ();

cm.Matrix00 = cm.Matrix11 = cm.Matrix22 = -1;
cm.Matrix40 = cm.Matrix41 = cm.Matrix42 = 1;

ia.SetColorMatrix(cm);

// Jetzt können die ImageAttributes als Parameter für Graphics.DrawImage
// verwendet werden, um das Bild beim Zeichnen zu invertieren, z.B.
e.Graphics.DrawImage (bmp,
                      new Rectangle (0, 0, bmp.Width, bmp.Height),
                                     0, 0, bmp.Width, bmp.Height,
                      GraphicsUnit.Pixel,
                      ia);

Siehe auch das Kapitel Neueinfärben von Bildern und dessen Unterabschnitte:

Gewusst wie: Verwenden einer Farbmatrix zum Transformieren einer Farbe
Gewusst wie: Verschieben von Bildfarben
Skalieren von Farben mithilfe von Transformationen
Gewusst wie: Drehen von Farben
Gewusst wie: Scheren von Farben
Gewusst wie: Verwenden einer Farbumwandlungstabelle

Schlagwörter: color, colors, Farbe, Farben, ColorMatrix, Bitmap, Image, Graphics, ImageAttributes, invertieren, negieren, umkehren, 1000 Worte

Quelle: myCSharp.de

S
4 Beiträge seit 2013
vor 10 Jahren

sorry fürs ausgraben.

wie könnte man das bild verändern ohne es zeichnen zu müssen? ich finde irgendwie keine möglichkeit die matrix an das bild zu übergeben

herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 10 Jahren

Hallo sl1ce,

meines Wissens hat ein Bitmap-Objekt selbst - bis auf das (sehr langsame) SetPixel - keine verändernden Methoden. Alle Veränderungen laufen über ein Graphics-Objekt. Und bei dem ist wiederum DrawImage die einzige Methode, die dafür passt. Ich sehe also keine Alternative zu dem Code und auch keinen Grund, warum man es nicht wie beschrieben machen sollte.

Natürlich ist man bei der Wahl des Zeichenziels frei. Man muss also nicht - wie im Beispiel - den e.Graphics-Parameter der OnPaint-Methode bzw. des Paint-Events verwenden, sondern kann per Graphics.FromImage ein Graphics-Objekt erzeugen, das ein Bitmap-Objekt als Ziel der Zeichenoperationen verwendet.

Ein Beispiel für dieses Vorgehen findet sich z.B. in [gelöst] Bitmap-Randproblem beim Verkleinern mit InterpolationMode.HighQualityBilinear. Und allgemeiner ist es in [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox) beschrieben.

herbivore