Parvlup - Fr 09.03.12 19:29
Titel: Invertierungsfilter mit C#
Hallo, hab auf
http://www.stackoverflow.com einen Code zu einem Invertierungsfilter für ein Bild
gefunden.
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++) { var c = pixels[i]; var a = 0x000000FF & (c >> 24); var r = 0x000000FF & (c >> 16); var g = 0x000000FF & (c >> 8); var b = 0x000000FF & (c);
r = 0x000000FF & (0xFF - r); g = 0x000000FF & (0xFF - g); b = 0x000000FF & (0xFF - b);
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
Th69: Code- durch C#-Tags ersetzt
Th69 - Sa 10.03.12 13:44
Hallo Parvlup :welcome:
dies sind Bitoperationen, s.a. den Artikel
Bitoperationen in C# [
http://www.mycsharp.de/wbb2/thread.php?threadid=48671].
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).