PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : red = (pixel >> 16) & 0xff__Was heißt das?



BenNavis
26-01-2004, 13:16
Hallo,

ich beschäftige mich mit dem auslesen von Farbwerten aus einem Bild und hab dazu etwas interessantes in Java ist auch eine Insel (http://www.galileocomputing.de/openbook/javainsel2/java_140013.htm#Rxxjava_140013259ProducerundConsum erfurBilder) gefunden.
Leider werde ich aus der Umrechnung des Werts im Array in einen RGB Wert nicht schlau.


int red = (pixel >> 16) & 0xff,
green = (pixel >> 8) & 0xff,
blue = (pixel) & 0xff;
System.out.println(pixel);
System.out.println("R=" + red + " G=" + green + " B=" + blue);


Ein ">>" ist mir noch die untergekommen und ich finde dazu nichts.

Einige Beispiele (oben Pixel, dazu unten RGB):



-12303292
R=68 G=68 B=68
-10855846
R=90 G=90 B=90
-1
R=255 G=255 B=255


Kann mir jemand helfen?

Danke,
Ben

axeljaeger
26-01-2004, 13:43
Genau kann ich dir das auch nicht erklären, nur ungefär:
Ein int besteht aus 32 Bit, also 4*8Bit = 4 Byte. Jetzt wird gerne in jedem dieser Bytes eine Farbkomponente eines Pixels gespeichert (r g b a). Mit dem angesprochenen Code kann du die einzelnen Bytes aus der Zahl rausholen

BenNavis
26-01-2004, 14:34
danke dir axeljäger,
sowas ähnliches hatte ich mir schon gedacht, nur das >> verwirrt mich nach wie vor.

B.

Shack
26-01-2004, 23:50
Die Zeichen: << oder auch >> sind Bitoberatoren.

Soll heissen im Fall "red" werden die Bits um 16 Stellen nach rechts verschoben.

Beispiel :

Die Zahl 80 würde binär so ausehen :

0101 0000

und jetzt: zahl = 80 >> 3 // schiebt alle Bit um 3 Stellen nach recht, wobei von links mit 0 aufgefüllt wird.

zahl sieht dann so aus : 0000 1010

zahl hätte dann also den Wert : 10

Die Verschiebung nach rechts ist also die Division um die 2-er Potenz:
80 / 2^3 == 10

Dem entsprechent ist das Verschieben nach links die Multiplikation:
10 * 2^3 = 80


In deinem Beispiel erfolgt danach noch ne bitweise Und-Verküfung mit 255 (0xff)

also : 0000 1010
& 1111 1111
_________
0000 1010 == 10

Hoffe es hilft erstmal weiter.

axeljaeger
27-01-2004, 08:22
Da hab ich dann noch die Frage: Was bringt die Und-Verknüpfung? Wenn ich die Bits nur verschiebe, hab ich ja immer noch nicht das eine Byte einzeln, sondern nur alles etwas verschoben. Wie bekommt man jetzt den überflüssigen Schrott weg? Oder fällt der automatisch weg?

wraith
27-01-2004, 08:43
Original geschrieben von axeljaeger
Da hab ich dann noch die Frage: Was bringt die Und-Verknüpfung? Wenn ich die Bits nur verschiebe, hab ich ja immer noch nicht das eine Byte einzeln, sondern nur alles etwas verschoben. Wie bekommt man jetzt den überflüssigen Schrott weg? Oder fällt der automatisch weg?
Na,die und-Verknüpfung ist ja gerade dazu da,um den überflüssigen Schrott wegzubekommen.In Shacks Beispiel kommt das nicht raus,aber wenn in den höheren Bits (> 8) etwas != 0 steht,dann wird es durch die und-Verknüpfung gelöscht.
Bsp
1010111101 & 0011111111 (= 0x255)
= 0010111101

axeljaeger
27-01-2004, 09:05
Also bei der UND-Verknüpfung überleben nur die Bits, die in beiden verknüpften Teilen eine 1 haben? Wie ist das bei so integern, wo irgendwelche Flags zusammenge'or'd werden? Da kann man ja etwa sowas schreiben: int wflags = Qt::WStyleCustomze | Qt::WNoBorder.
Wenn ich da jetzt gucken will, welche davon zusammenge'or'd wurden, dann macht man das ja auch mit einer Und-Verknüpfung, etwa so:



if(wflags & WStyleCustomzie){
// do something
}

Was hat es damit auf sich?

wraith
27-01-2004, 09:27
Sagen wir,wir hätten drei Flags mit den Werten
A = 1 (binär 1)
B = 2 (binär 10)
C = 4 (binär 100)

Wenn wir einer Funktion mehrere Flags übergeben wollen,verodern wir zwei oder mehr,z.b A und C
A | C = (binär 101)

Um in der Funktion zu prüfen ob das Flag A gesetzt ist,verundet man den Parameter mit A,und da in A nur ein Bit gesetzt ist,werden alle andere Bits gelöscht,und es bleibt nur ein Bit stehen,und nur dann wenn es vorher an der Stelle A gesetzt war
Bsp
101 & A (= 1) = 1,also A ist gesetzt
110 & A = 0,also A nicht gesetzt
100 & C = 100,also != 0,also C gesetzt.

BenNavis
27-01-2004, 10:32
Original geschrieben von Shack
Die Zeichen: << oder auch >> sind Bitoberatoren.

Soll heissen im Fall "red" werden die Bits um 16 Stellen nach rechts verschoben.

Beispiel :

Die Zahl 80 würde binär so ausehen :

0101 0000

und jetzt: zahl = 80 >> 3 // schiebt alle Bit um 3 Stellen nach recht, wobei von links mit 0 aufgefüllt wird.

zahl sieht dann so aus : 0000 1010

zahl hätte dann also den Wert : 10

Die Verschiebung nach rechts ist also die Division um die 2-er Potenz:
80 / 2^3 == 10

Dem entsprechent ist das Verschieben nach links die Multiplikation:
10 * 2^3 = 80


In deinem Beispiel erfolgt danach noch ne bitweise Und-Verküfung mit 255 (0xff)

also : 0000 1010
& 1111 1111
_________
0000 1010 == 10

Hoffe es hilft erstmal weiter.


Danke Dir, jetzt hab ich es begriffen :)

B.