byte[] aus einem BufferedImage

FerFemNemBem

Bekanntes Mitglied
Halloechen,

ich habe ein Problem damit, folgende Methode "umzudrehen":

Java:
private BufferedImage getImageFromImageData(byte[] imageData, int imageWidth, int imageHeight)
    {  
        ByteBuffer byteBuffer = ByteBuffer.wrap(imageData);
        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
        ShortBuffer shortBuffer = byteBuffer.asShortBuffer();
        short[] shortImageData = new short[shortBuffer.capacity()];
        for(int i=0; i<shortImageData.length; i++)
        {
            shortImageData[i] = shortBuffer.get(i);
        }
        
        ColorModel cm = new DirectColorModel(16, 0xF800, 0x7E0, 0x1F);      
        DataBufferUShort db = new DataBufferUShort(shortImageData, shortImageData.length);
        
        // hack to workaround an iTunes/iPod bug
        // if width or hight not even - add 1
        if((imageWidth % 2 != 0) || (imageHeight % 2 != 0))
        {
            if (imageWidth % 2 != 0) imageWidth = imageWidth+1;
            if (imageHeight % 2 != 0) imageHeight = imageHeight+1;
            short[] shortImageDataFixed = new short[shortImageData.length+(imageWidth*imageHeight/2)];    
            System.arraycopy(shortImageData, 0, shortImageDataFixed, 0, shortImageData.length); 
            db = new DataBufferUShort(shortImageDataFixed, shortImageDataFixed.length); 
        }

        SampleModel sm = cm.createCompatibleSampleModel(imageWidth, imageHeight);
        WritableRaster wr = Raster.createWritableRaster(sm, db, null);
        BufferedImage bufferedImage = new BufferedImage(cm, wr, false, null);

        return bufferedImage;   
    }

Mein grosses Problem an der Stelle ist es, aus dem DataBufferUShort, welches mir das WritableRaster bietet, ein byte[] zu machen.

Folgender Ansatz geht jedenfalls nicht:

Java:
    private byte[] getImageDataFromImage(BufferedImage bufferedImage)
    {
        byte[] imageData = new byte[]{};
        WritableRaster wr = bufferedImage.getRaster();        
        DataBufferUShort dataBufferUShort = (DataBufferUShort)wr.getDataBuffer();
        
        short[] shortData = dataBufferUShort.getData();
        
        byte[] test = new byte[shortData.length];
        for (int i=0; i<shortData.length; i++)
        {
            test[i] = (byte)shortData[i];
        }

        ByteBuffer byteBuffer = ByteBuffer.wrap(test);
        byteBuffer.order(ByteOrder.BIG_ENDIAN);
        
        imageData = byteBuffer.array();
        return imageData;
    }

Wuerde mich ueber den ein oder anderen Tip freuen.

Achso, hallo erstmal ans Forum, ich bin der Jan. ;)

Gruss, FFNB.
 
S

SlaterB

Gast
du hast zwischendurch ein Short-Array, in welchem immer zwei Bytes stehen, beim Rückschritt liest du aber jeweils nur ein Byte heraus,
habe mal ein paar byte-Befehle dazu zusammengetippt, so dass es für mein einfaches Beispiel passt,

ob das mit beliebigen Bytes, negativen Werten, LITTLE_ENDIAN usw. oder gar beim 'hack to workaround' hinkommt?..
vielleicht kann ShortBuffer dabei auch noch helfen, habe aber auf die Schnelle nix gesehen

Java:
public class Test
{
    public static void main(String[] args)
    {

        byte[] b = new byte[] {4, 5, 6, 7, 8, 9};
        BufferedImage bi = getImageFromImageData(b, 2, 2);
        System.out.println("back");
        b = getImageDataFromImage(bi);
        System.out.println(Arrays.toString(b));
    }

    private static byte[] getImageDataFromImage(BufferedImage bufferedImage)
    {
        WritableRaster wr = bufferedImage.getRaster();
        DataBufferUShort dataBufferUShort = (DataBufferUShort)wr.getDataBuffer();

        short[] shortData = dataBufferUShort.getData();
        System.out.println("short: " + Arrays.toString(shortData));

        byte[] test = new byte[shortData.length * 2];
        for (int i = 0; i < shortData.length; i++)
        {
            test[2 * i + 1] = (byte)(shortData[i] / 256);
            test[2 * i] = (byte)(shortData[i] - test[2 * i + 1] * 256);
        }

        ByteBuffer byteBuffer = ByteBuffer.wrap(test);
        byteBuffer.order(ByteOrder.BIG_ENDIAN);
        byte[] imageData = byteBuffer.array();
        return imageData;
    }

    private static BufferedImage getImageFromImageData(byte[] imageData, int imageWidth, int imageHeight)
    {
        ByteBuffer byteBuffer = ByteBuffer.wrap(imageData);
        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
        ShortBuffer shortBuffer = byteBuffer.asShortBuffer();
        short[] shortImageData = new short[shortBuffer.capacity()];
        for (int i = 0; i < shortImageData.length; i++)
        {
            shortImageData[i] = shortBuffer.get(i);
        }

        ColorModel cm = new DirectColorModel(16, 0xF800, 0x7E0, 0x1F);
        DataBufferUShort db = new DataBufferUShort(shortImageData, shortImageData.length);

        // hack to workaround an iTunes/iPod bug
        // if width or hight not even - add 1
        if ((imageWidth % 2 != 0) || (imageHeight % 2 != 0))
        {
            if (imageWidth % 2 != 0) imageWidth = imageWidth + 1;
            if (imageHeight % 2 != 0) imageHeight = imageHeight + 1;
            short[] shortImageDataFixed = new short[shortImageData.length + (imageWidth * imageHeight / 2)];
            System.arraycopy(shortImageData, 0, shortImageDataFixed, 0, shortImageData.length);
            db = new DataBufferUShort(shortImageDataFixed, shortImageDataFixed.length);
        }
        System.out.println("short: " + Arrays.toString(shortImageData));

        SampleModel sm = cm.createCompatibleSampleModel(imageWidth, imageHeight);
        WritableRaster wr = Raster.createWritableRaster(sm, db, null);
        BufferedImage bufferedImage = new BufferedImage(cm, wr, false, null);

        return bufferedImage;
    }
}
 

FerFemNemBem

Bekanntes Mitglied
Halloechen,

ich wollte mich nur nochmal kurz zu einer Korrektur melden (falls noch einmal jemand vor dem Problem stehen sollte). Die von SlaterB vorgeschlagenen Loesung:

Code:
        for (int i = 0; i < shortData.length; i++)
        {
            test[2 * i + 1] = (byte)(shortData[i] / 256);
            test[2 * i] = (byte)(shortData[i] - test[2 * i + 1] * 256);
        }
funktioniert nicht in allen Faellen.
So geht es dann:

Code:
        for (int i = 0; i < shortData.length; i++)
        {
            test[2 * i + 1] = (byte)(shortData[i] >> 8);
            test[2 * i]   = (byte)(shortData[i] & 0xff);
        }

Trotzdem nochmal vielen Dank fuer die Prompte Hilfe hier im Forum!

Gruss, FFNB.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T BufferedImage aus einem byte-Array? Allgemeine Java-Themen 2
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
R In einem Byte-Array nach einer gewissen Zahlenfolge suchen Allgemeine Java-Themen 7
P Einzelne Bits in einem Byte-Array setzen Allgemeine Java-Themen 2
G Byte- List mit einem Iterator durchlaufen Allgemeine Java-Themen 5
M Vector zu einem byte[] Allgemeine Java-Themen 5
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
Thallius unsigned byte Allgemeine Java-Themen 18
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
kodela Datentypen byte als unsigned interpretieren Allgemeine Java-Themen 23
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
TheWhiteShadow 2D-Grafik GIF Library mit byte output Allgemeine Java-Themen 10
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
kodela Byte Order Mark (BOM) bei readLine() ignorieren Allgemeine Java-Themen 5
A Byte zu String Allgemeine Java-Themen 4
RalleYTN Datentypen Unsignierter Byte zum signierten Byte Allgemeine Java-Themen 2
X Datentypen Byte geht nicht höher als 126 auch nicht mit casten? Allgemeine Java-Themen 22
R Byte Array Zeichensuche Allgemeine Java-Themen 6
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
O Byte-Array zu String Allgemeine Java-Themen 7
D Decodierung von Mp3-byte[] Allgemeine Java-Themen 4
A ByteBuffer.get(byte[] dst,int offset,int length) Allgemeine Java-Themen 2
A RandomAccessFile.read(byte[] b) Allgemeine Java-Themen 9
P Datentypen Warum überhaupt Byte ? Allgemeine Java-Themen 12
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
E Byte zu String & umgekehrt Allgemeine Java-Themen 3
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
M Chart per byte[] in JSP anzeigen Allgemeine Java-Themen 4
E int in byte Allgemeine Java-Themen 6
R ArrayList byte[] abspeichern Allgemeine Java-Themen 4
S byte [] in string und zurück konvertieren Allgemeine Java-Themen 2
G byte ? : Allgemeine Java-Themen 7
E Byte-Array to String: Zeichenkaputt Allgemeine Java-Themen 11
hdi Speicherbelegung byte, short, int Allgemeine Java-Themen 8
J byte - hex - byte.. casten Allgemeine Java-Themen 8
R byte[] to String Konvertieren Allgemeine Java-Themen 14
A Input/Output Buffered Image zu Byte Array und zurück konvertieren Allgemeine Java-Themen 4
M byte array splitten Allgemeine Java-Themen 3
J Hex-String zu byte transformieren Allgemeine Java-Themen 7
T Zu doof für byte-Umrechnung ... Allgemeine Java-Themen 3
W CRC32 aus byte array Allgemeine Java-Themen 5
L byte -> byte[1] -> byte Allgemeine Java-Themen 2
Kr0e Synchronisieren: boolean,byte,char ? Allgemeine Java-Themen 2
S Überprüfung/Parsen eines Byte-Arrays Allgemeine Java-Themen 9
Semox Byte-Manipulation eines Bildes Allgemeine Java-Themen 7
Meldanor For-Schleifen - byte statt int? Allgemeine Java-Themen 11
C int zu byte cast - verständnis Allgemeine Java-Themen 3
R int to byte[] Array Allgemeine Java-Themen 4
MQue byte[] Array to Integer Allgemeine Java-Themen 4
MQue Byte to Int convertieren Allgemeine Java-Themen 2
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
W Verwendung von byte Allgemeine Java-Themen 9
G zu lange Byte code dateien Allgemeine Java-Themen 6
G String in byte- Array Allgemeine Java-Themen 3
E Byte [] nach hex, dann nach dec Allgemeine Java-Themen 2
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
G 2 x byte zusammenkopieren Allgemeine Java-Themen 7
G byte nach int Allgemeine Java-Themen 3
foobar Object to byte[] ohne Serializable Allgemeine Java-Themen 6
data89 Die Größe eines Strings in Byte berechnen? Allgemeine Java-Themen 12
W Konflikt byte->int, in.read->arraycopy Allgemeine Java-Themen 7
T "unsigned" byte[] -> BigInteger Allgemeine Java-Themen 2
F byte in hex-String oder: Wer hat in Mathe aufgepasst Allgemeine Java-Themen 3
T Socket Server Anwendung - Empfang eines Byte-Arrays Allgemeine Java-Themen 7
J NumberFormatException bei String->byte[] Allgemeine Java-Themen 12
ARadauer Blob aus byte Array erstellen? Allgemeine Java-Themen 3
T Object -> byte[] Allgemeine Java-Themen 5
G Byte[] zeichenweise lesen Allgemeine Java-Themen 4
G byte[] mit Strings füllen Allgemeine Java-Themen 2
B int -> byte Allgemeine Java-Themen 2
G file --> byte[] Allgemeine Java-Themen 7
E Problem beim Dateien kodieren ("Byte = Byte +1") Allgemeine Java-Themen 3
I String -> byte[] -> String Allgemeine Java-Themen 2
D byte nach integer? Allgemeine Java-Themen 4
MQue int in byte Allgemeine Java-Themen 18
G Maximalgröße von byte[] buffer Allgemeine Java-Themen 7
E String -> byte[] Allgemeine Java-Themen 6
C Byte[] to String Allgemeine Java-Themen 7
D datei in byte[]-array schreiben Allgemeine Java-Themen 6
D byte[] problem Allgemeine Java-Themen 3
MQue ArrayList in ein byte- Array Allgemeine Java-Themen 7
B ein spezielles Byte-Array sortieren Allgemeine Java-Themen 11
T OutputStream - Event bei Byte-Fluss Allgemeine Java-Themen 5
J byte-Array in Hashmap speichern? Allgemeine Java-Themen 3
S Problem beim Einlesen von byte-werten aus datei Allgemeine Java-Themen 2
J byte-Array als String übers http schicken Allgemeine Java-Themen 8
F List<String> zu byte[] Allgemeine Java-Themen 7
L byte vs. int Allgemeine Java-Themen 6
G Umwandlung Byte in Integer Allgemeine Java-Themen 12
N Byte-Code entschlüsseln (Bitmasks?) Allgemeine Java-Themen 3
R byte - string? Allgemeine Java-Themen 10
R Stream Byte für Byte durchgehen Allgemeine Java-Themen 5
S java.io.InputStream.read(byte[] b) überschreiben Allgemeine Java-Themen 33
B boolean array = byte array (platzverbrauch) Allgemeine Java-Themen 6
L byte[] to int Allgemeine Java-Themen 2
C Byte Array aus Datei erzeugen Allgemeine Java-Themen 6
B Problem mit Einlesen vom Byte FF aus Dateien Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben