Feedback

C# - Floyd Steinberg Dithering

Veröffentlicht von am 6/7/2006
(2 Bewertungen)
Wandelt ein Bitmap in ein Bitmap mit einem Bit Farbtiefe um. Berechnung mit dem Floyd-Steinberg Dithering Verfahren.
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 12/10/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!