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 Komplett

Sie stehen vo der Aufgabe, individuelle Anwendungen für Windows zu schreiben. Hier ist VB.NET die optimale Sprache. Sie erlernt sich recht leicht und passt sich komplett in die .NET Umgebung von Microsoft ein. Nach der Schulung entwickeln Sie anwenderfreundliche Programme in VB.NET . Mit den objektorientierten Modellen in VB.NET erzeugen Sie außerdem wiederverwendbare Komponenten.

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!