Feedback

C# - Floyd Steinberg Dithering

Veröffentlicht von am 07.06.2006
(2 Bewertungen)
Wandelt ein Bitmap in ein Bitmap mit einem Bit Farbtiefe um. Berechnung mit dem Floyd-Steinberg Dithering Verfahren.
GFU-Schulungen  [Anzeige]

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

VB.NET 2017/2015/2013 Einführung

Das Seminar befähigt Sie zur eigenständigen Entwicklung von anwenderorientierten Programmen in VB.NET, worin auch der Einsatz von Datenbanken enthalten ist.

public int[,] DitheringArray;

private Bitmap Dithering(Bitmap Orginalbild)
{
    int Höhe = Orginalbild.Height;
    int Breite = Orginalbild.Width;
    DitheringArray = new int[Höhe, Breite];
    int Spalte = 0, Zeile = 0, temp = 0;
    Bitmap neu = new Bitmap(Breite, Höhe);
    int rot = 0, grün = 0, blau = 0, grau = 0;

    for (Spalte = 0; Spalte < Breite; Spalte++)
    {
        for (Zeile = 0; Zeile < Höhe; Zeile++)
        {
            Color pixel = Orginalbild.GetPixel(Spalte, Zeile);
            rot = pixel.R;
            grün = pixel.G;
            blau = pixel.B;
            grau = GrauBerechnen(rot, grün, blau);
            DitheringArray[Zeile, Spalte] = grau;
        }
    }
    
    for (Zeile = 1; Zeile < Höhe - 1; Zeile++)
    {
        for (Spalte = 1; Spalte < Breite - 1; Spalte++)
        {
            DitheringBerechnen(Zeile, Spalte);
        }
    }

    for (Spalte = 0; Spalte < Breite; Spalte++)
    {
        for (Zeile = 0; Zeile < Höhe; Zeile++)
        {
            Color pixel = Orginalbild.GetPixel(Spalte, Zeile);
            temp = DitheringArray[Zeile, Spalte];
            if (temp == 0)
                temp = 0;
            else
                temp = 255;
            pixel = Color.FromArgb(temp, temp, temp);
            neu.SetPixel(Spalte, Zeile, pixel);
        }
    }
    return neu;
}

public int GrauBerechnen(int rot, int gruen, int blau)
{
    return (rot + gruen + blau) / 3;
}

public void DitheringBerechnen(int Zeile, int Spalte)
{
    int Teiler = 0;
    if (DitheringArray[Zeile, Spalte] < 128)
    {
        Teiler = DitheringArray[Zeile, Spalte] / 16;
        DitheringArray[Zeile, Spalte] = 0;
    }
    else
    {
        Teiler = (DitheringArray[Zeile, Spalte] - 255) / 16;
        DitheringArray[Zeile, Spalte] = 1;
    }
    DitheringArray[Zeile + 1, Spalte - 1] += (Teiler * 3);
    DitheringArray[Zeile + 1, Spalte] += (Teiler * 5);
    DitheringArray[Zeile + 1, Spalte + 1] += Teiler;
    DitheringArray[Zeile, Spalte + 1] += (Teiler * 7);
}
Abgelegt unter Floyd, Steinberg, Dithering, Bitmap.

1 Kommentare zum Snippet

herbivore schrieb am 10.12.2006:
GetPixel und SetPixel arbeiten sehr langsam. Hier könnte die Verwendung von Bitmap.LockBits zu einer erheblichen Beschleunigung führen.
 

Logge dich ein, um hier zu kommentieren!