Wie man Bilder auf Pixelebene in C # manipuliert

Wie manipuliere ich Bilder auf Pixelebene in C #?

Ich muss in der Lage sein, jeden Bitmap-Pixel RGB-Werte separat zu lesen / zu ändern.

Ein Codebeispiel würde geschätzt werden.

Wenn Sie Geschwindigkeit wollen, dann LockBits . Sehen Sie hier für eine gute Komplettlösung von Bob Powell . Wenn Sie nur ein paar bearbeiten möchten, sollte GetPixel / SetPixel tun, was Sie wollen.

Eine Beispielcode-Routine (ich verwende diese für eine einfache Zusammenführungs- und Vergleichsfunktion. Sie benötigt zwei Bilder und erzeugt ein drittes Graustufenbild, das die Unterschiede zwischen den beiden Bildern als Graustufen-Tonpegel zeigt. Je dunkler es ist, desto mehr Diff.):

public static Bitmap Diff(Bitmap src1, Bitmap src2, int x1, int y1, int x2, int y2, int width, int height) { Bitmap diffBM = new Bitmap(width, height, PixelFormat.Format24bppRgb); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { //Get Both Colours at the pixel point Color col1 = src1.GetPixel(x1 + x, y1 + y); Color col2 = src2.GetPixel(x2 + x, y2 + y); // Get the difference RGB int r = 0, g = 0, b = 0; r = Math.Abs(col1.R - col2.R); g = Math.Abs(col1.G - col2.G); b = Math.Abs(col1.B - col2.B); // Invert the difference average int dif = 255 - ((r+g+b) / 3); // Create new grayscale RGB colour Color newcol = Color.FromArgb(dif, dif, dif); diffBM.SetPixel(x, y, newcol); } } return diffBM; } 

Marcs Beitrag notiert LockBits und benutzt diese, um das Bild direkt im Speicher zu verändern. Ich schlage vor, dass ich das eher ansehe als was ich gepostet habe, wenn die performance ein Problem ist. Danke Marc!

System.Drawing.Bitmap verfügt über eine öffentliche GetPixel-Methode (int x, int y), die eine System.Drawing.Color-Struktur zurückgibt. Diese Struktur enthält die Byte-Member R, G, B und A, die Sie direkt ändern können, und ruft SetPixel (Color) in Ihrem Bitmap erneut auf.
Leider wird das relativ langsam sein, aber es ist der einfachste Weg, es in C # zu machen. Wenn Sie mit einzelnen Pixeln viel arbeiten und feststellen, dass die performance fehlt und Sie etwas schneller benötigen, können Sie LockBits verwenden … Es ist jedoch viel komplizierter, da Sie die Bitstruktur für diese Farbtiefe und den Typ verstehen müssen , und arbeite mit dem Bitmap Schritt und was nicht … also, wenn Sie es für notwendig halten, stellen Sie sicher, dass Sie ein gutes Tutorial finden! Es gibt mehrere da draußen im Internet, Googeln “C # LockBits” bekommen Sie ein halbes Dutzend, die einen lesenswerten Wert sind.

Wenn die performance entscheidend ist, wird eine andere Alternative zu LockBits DirectX verwaltet.

Weitere Informationen finden Sie in der früheren Frage zum Stack-Überlauf Rendering von Grafiken in C # .

Wie bei Lockbits müssen Sie den unsicheren Schlüsselwort- / Compiler-Schalter verwenden, aber Sie erhalten einen leistungsstarken Zugriff auf Pixelebene.

Im Vergleich zur Verwendung der normalen Bitmap-class und des PictureBox-Steuerelements erhalten Sie auch ein leistungsstärkeres Bildschirm-Rendering über DirectX-Backbuffering.