Pixel aus BufferedImage auslesen und Größe


Federhalter

Mitglied
Hallo,

es würde mich interessieren, wie man Pixel aus einem BufferedImage ( png ) auslesen kann?
Ich habe mich bereits informiert und zwei Ansätze gefunden:

1. Pixels = ((DataBufferInt)Image.getRaster().getDataBuffer()).getData().
2. Pixels[x+j*width] = Image.getRGB(x,y);

Was ist der Unterschied zwischen den beiden?

Außerdem habe ich Probleme mit der Größe. Mein Bild ist tatsächlich 64x32 groß.
Wenn ich aber mit Graphics2D mithilfe von Transformationen ein Bild auf 64x32 skaliere und drehe (Isometrie),
dann ist dieses größer als mein Bild, nämlich um genau 16 Pixel in Breite und Höhe. Warum ist das so?
 

sheel

I love Asm
Hi

Methode 1 hat afaik das Problem, dass
a) Bilddaten auch ohne Kompression so ca. 30 gängige Farbformate haben. Sind die ersten drei Byte R-G-B des ersten Pixels, und die nächsten das vom zweiten Pixel? oder ist es B-G-R? Gibt es pro Pixel ein viertes Byte (wenn ja, ist das sinnlos oder transparenz)? Hast du evt. gar nicht R/G/B sondern zB. Y/U/V? Hat jeder Farbteil wirklich 8 bit? usw.usw.
Je nach Bild kann sich das unterscheiden.
b) Wieder afaik: Dass der Cast zu DataBufferInt funktioniert ist nicht garantiert. Wenn irgendeine Javaimplementierung was Anderes verwendet, evt. auch nur bei bestimmten Bildarten, bekommt man Exceptions.
c) Nach einer "Pixelzeile" im Bild können noch Füllbyte sein, bevor die Daten der nächsten Zeile beginnen.

Methode 2 löst diese Probleme für dich, ist aber viel langsamer. Wenn das ganze Bild so durchgearbeitet werden soll wird der Unterschied vermutlich deutlich spürbar sein.

Zum Größenproblem: Wie und aus welchem Objekt liest du die Größe aus?
 
Zuletzt bearbeitet:

Federhalter

Mitglied
Danke für die schnelle Antwort.
Ich habe grad meine grauen Zellen angestrengt und habe es geschafft. Ich kann nun die Pixel von beliebigen Bildern in ein anderes (gleicher Größe) malen. Aber ich finde das Thema sehr interessant.

Ich habe folgendes gemacht. Zuerst habe ich ein leeres BufferedImage erstellt mit TYPE_INT_ARGB und der gleichen Größe wie mein Sprite (64x32). Anschließend die Pixel mit getRGB() ausgelesen und dann übertragen.
Hab grad keine Zeit mehr melde mich