Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1550 | Anzahl registrierter User: 1840 | Besucher online: 145
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Floyd Steinberg Dithering


Autor: Jan Welker
Sprache: C#
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 8390
  
Kick it on dotnet-kicks.de  

Beschreibung:

Wandelt ein Bitmap in ein Bitmap mit einem Bit Farbtiefe um. Berechnung mit dem Floyd-Steinberg Dithering Verfahren.

Abgelegt unter: Floyd, Steinberg, Dithering, Bitmap.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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);
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

herbivore schrieb am:  10.12.2006 00:32:56

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


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.