Frage

Wie manipulieren wir Bilder auf Pixelebene in C #?

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

wäre ein Codebeispiel geschätzt werden.

War es hilfreich?

Lösung

Wenn Sie Geschwindigkeit wollen, dann LockBits . Sehen Sie hier für einen guten Durchlauf von Bob Powell . Wenn Sie wollen einfach nur ein paar, dann GetPixel / SetPixel tun sollten, was Sie wollen.

Andere Tipps

Ein Beispielcode Routine (ich benutze diese für einfache Zusammenführung und Funktionalität vergleichen. Es dauert zwei Bilder und ein drittes Graubild, die Unterschiede zwischen den beiden Bildern als Graustufen-Tonwert zeigt. Je dunkler es ist, desto mehr wird die 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 Notizen LockBits und verwenden, die das Bild direkt in den Speicher zu modifizieren. Ich würde vorschlagen, dass bei der Suche eher als das, was ich geschrieben habe, wenn die Leistung ein Anliegen. Dank Marc!

System.Drawing.Bitmap hat eine GetPixel (int x, int y), die eine öffentliche Methode System.Drawing.Color Struktur zurückgibt. Das struct hat Byte Mitglieder R, G, B und A, die Sie direkt ändern können, und dann wieder SetPixel (Farbe) auf dem Bitmap nennen.
Leider das geht relativ langsam sein, aber es ist von dem einfachste Weg, es in C # zu tun. Wenn Sie mit einzelnen Pixeln viel arbeiten und finden Sie die Leistung fehlt, und Sie brauchen etwas schneller, können Sie LockBits verwenden ... Es ist allerdings viel komplizierter, als Sie die Bit-Struktur für die Farbtiefe und die Art zu verstehen, müssen und mit dem Schritt des Bitmaps arbeiten und was nicht ... also, wenn Sie es nötig ist, stellen Sie sicher, dass Sie ein gutes Tutorial finden! Es gibt mehrere dort draußen auf dem Netz, googeln „C # LockBits“ finden Sie ein halbes Dutzend erhalten, die lesenswert sind.

Wenn die Leistung entscheidend ist, eine weitere Alternative zu LockBits verwaltet DirectX.

Sehen Sie die frühere Frage Stack-Überlauf Rendering Grafiken in C # für weitere Informationen.

Wie Lockbits müssen Sie das Schlüsselwort unsafe / Compiler-Option verwenden, aber Sie Hochleistungs-Pixelebene Zugang zu bekommen.

Sie erhalten auch eine höhere Leistung Bildschirm-Rendering über DirectX backbuffering, im Vergleich zu der normalen Bitmap-Klasse und Picture-Steuerelement.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top