Autor Beitrag
Parvlup
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Fr 09.03.12 19:29 
Hallo, hab auf www.stackoverflow.com einen Code zu einem Invertierungsfilter für ein Bild
gefunden.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
(Writeable bitmap = new ...)
int[] pixels = bitmap.Pixels;
int size = pixels.Length;
for (int i = 0; i < size; i++)
{
        // Extract color components
        var c = pixels[i];
        var a = 0x000000FF & (c >> 24);
        var r = 0x000000FF & (c >> 16);
        var g = 0x000000FF & (c >> 8);
        var b = 0x000000FF & (c);

        // Invert
        r = 0x000000FF & (0xFF - r);
        g = 0x000000FF & (0xFF - g);
        b = 0x000000FF & (0xFF - b);

        // Set result color
        pixels[i] = (a << 24) | (r << 16) | (g << 8) | b;
}

Ich bräuchte wirklich dringend Hilfe!
Hier meine Fragen:
könnte mir jemand genau insbesondere den ausdruck: var a = 0x000000FF & (c >> 24); usw.
erklären? woher kommt die 8stellige hexadezimazahl. ist dies der var 32bit integer, wobei zwei zahlen je für die Kanäle alpha rot grün und blau stehen? und was passiert z.B. hier genau? r = 0x000000FF & (0xFF - r); man zieht von was den Rotwert ab? sind bestimmt Anfängerfragen, ich weiß es allerdings nicht besser.

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 10.03.12 13:44 
Hallo Parvlup :welcome:

dies sind Bitoperationen, s.a. den Artikel Bitoperationen in C#.

Ein Farbwert (Pixel) wird intern als 32bit-Wert (int) gespeichert, wobei je Farbkanal (A, R, G, B) ein Byte (d.h. 8bit) verwendet werden.

Und in hexadezimaler Schreibweise lassen sich diese Werte besser lesen (0xFF entspricht ja 255), da man besser das interne Bitmuster daraus erkennen kann.

Und nun zur Invertierung: dies bedeutet einfach, daß die Farbwerte (je Farbkanal) umgedreht werden, d.h. aus 0 wird 255, aus 1 wird 254, ..., aus 255 wird 0, also inverted = (255 - x) bzw. inverted = (0xFF - x).