Uitvoerwaarden van BufferedImage.getRGB begrijpen

Ik krijg een geheel getal voor de pixel in een afbeelding met deze methode:

int colour = img.getRGB(x, y);

Vervolgens ben ik de waarden aan het afdrukken en ik zie dat zwarte pixels overeenkomen met een waarde als “-16777216”, een soort blauw met iets als “-16755216”, enz. Kan iemand mij de logica hierachter uitleggen waarde?


Antwoord 1, autoriteit 100%

getRGB(int x, int y)retourneert de waarde van de kleurpixel op locatie (x,y).
U interpreteert de geretourneerde waarde verkeerd.
Het is in het binaire formaat.
zoals 11…11010101 en dat wordt u gegeven als int-waarde.
Als u RGB-componenten (d.w.z. rood, groen, blauw) met die waarde wilt krijgen, gebruik dan de kleurklasse. bijv.

Color mycolor = new Color(img.getRGB(x, y));

Vervolgens kunt u de waarde Rood, Groen of Blauw verkrijgen door getRed(), getGreen(), getBlue(), getAlpha().
Vervolgens wordt door deze methoden een int-waarde geretourneerd in een bekend formaat met de waarde 0 < value < 255

int red = mycolor.getRed();

Als u de klasse Colorniet wilt gebruiken, moet u bitsgewijze bewerkingen gebruiken om de waarde ervan te verkrijgen.


Antwoord 2, autoriteit 99%

De RGB intkleur bevat de rode, groene en blauwe componenten van de kleur in zijn bits. Je moet naar de binaire of hexadecimale weergave ervan kijken en niet naar een geheel geheel getal (niet naar de decimale weergave).

Een intheeft 32 bits, 3×8 = 24 wordt gebruikt om de RGB-componenten (8 bits voor elk) in het volgende formaat op te slaan:

              2          1          0
bitpos      32109876 54321098 76543210
------   --+--------+--------+--------+
bits     ..|RRRRRRRR|GGGGGGGG|BBBBBBBB|

U kunt de componenten extraheren of instellen met bitmaskers:

int color = img.getRGB(x, y);
// Components will be in the range of 0..255:
int blue = color & 0xff;
int green = (color & 0xff00) >> 8;
int red = (color & 0xff0000) >> 16;

Als de kleur ook een alfacomponent (transparantie) ARGB heeft, krijgt deze de laatste 8 bits.

          3          2          1          0
bitpos    10987654 32109876 54321098 76543210
------   +--------+--------+--------+--------+
bits     |AAAAAAAA|RRRRRRRR|GGGGGGGG|BBBBBBBB|

En de waarde:

int alpha = (color & 0xff000000) >>> 24; // Note the >>> shift
                                         // required due to sign bit

Een alfawaarde van 255 betekent dat een kleur volledig dekkend is en een waarde van 0 betekent dat de kleur volledig transparant is.

Uw kleur:

Uw kleur is color = -16755216met:

blue : 240         // Strong blue
green:  85         // A little green mixed in
red  :   0         // No red component at all
alpha: 255         // Completely opaque

Antwoord 3, autoriteit 16%

Zie de implementatievan ColorModel.getRgb:

589  public int getRGB(int pixel) {
590        return (getAlpha(pixel) << 24)
591             | (getRed(pixel) << 16)
592             | (getGreen(pixel) << 8)
593             | (getBlue(pixel) << 0);
594   }

Antwoord 4, autoriteit 12%

Het is uitgelegd in de documenten:

Retourneert een geheel getal in het standaard RGB-kleurmodel (TYPE_INT_ARGB) […]

Je krijgt dus 8 bits alfakanaal, 8 bits rood, 8 bits groen, 8 bits blauw.

Een eenvoudige (en langzame manier) om de waarde te onderzoeken is door new java.awt.Color(colour, true);te gebruiken en vervolgens de getters aan te roepen.

Of u kunt de waarde afdrukken als een niet-ondertekende 32-bits hexadecimale waarde: Integer.toString(colour, 16). Elke twee tekens van de uitvoer vormen een onderdeel van de ARGB-set.


Antwoord 5, autoriteit 7%

U kunt eigenlijk de int tot binaire reeks transformeren door integer.tobinarystring (-16755216), die 111111110000000001010101111000000 is. Het bestaat uit 4 bytes: alfa, rood, groen, blauw. De waarden zijn onbeperkt, wat betekent dat elke transparantie uitsluitend in de alfa-component wordt opgeslagen, en niet in de kleurencomponenten. De componenten worden als volgt opgeslagen (ALPHA & LT; & LT; 24) | (Red & LT; & LT; 16) | (groen & lt; & lt; 8) | blauw. Elke component varieert tussen 0..255 met 0 betekent geen bijdrage voor dat component en 255 betekenis 100% bijdrage. Zo zou ondoorzichtig zwart 0xFF000000 (100% ondoorzichtig zijn, maar geen bijdragen van rood, groen of blauw) en ondoorzichtig-wit zou 0xFFFFFFF zijn.

Other episodes