2016-05-03 5 views
0

Der Benutzer kann zu einer Bilddatei navigieren. Ich möchte die ausgewählte Datei in einer Datenbank (derby db) in BLOB-Spalte beibehalten. Um das zu tun, muss ich das Image-Objekt in ein Array von Bytes (Byte []) konvertieren, und um es zu erreichen, muss ich: Byte [] -> Image.Pure JavaFX: Bild in Bytes konvertieren Array (+ gegenläufige Operation). Was ist los mit dir?

So suche ich und fand diese: aus dieser question

reinen Java-fx Lösung Spuren (== Sie werden in fehlenden Punkten füllen müssen :)

Image i = logo.getImage(); 
PixelReader pr = i.getPixelReader(); 
PixelFormat f = pr.getPixelFormat(); 

WriteablePixelFromat wf = f.getIntArgbInstance(); //??? 

int[] buffer = new int[size as desumed from the format f, should be i.width*i.height*4]; 

pr.getPixels(int 0, int 0, int i.width, i.height, wf, buffer, 0, 0); 

ich auf diese Weise umgesetzt :

private ImageByteInfo imageToByteArray(Image i){ 
     PixelReader pr = i.getPixelReader(); 
     WritablePixelFormat<ByteBuffer> wf = PixelFormat.getByteBgraInstance(); 

     byte[] buffer = new byte[(int) (i.getWidth() * i.getHeight() *4)]; 

     pr.getPixels(0, 0, (int) i.getWidth(), (int) i.getHeight(), wf, buffer, 0, 0); 

     return new ImageByteInfo(buffer, (int) i.getWidth(), (int) i.getHeight()) ; 
    } 

Außer dass, wenn ich das Pufferarray erforsche. Ich habe festgestellt, dass nur die ersten 4096 Eintrag gültig sind (haben Sie die Nummer), ALLEN Rest des Arrays ist 0 0 0 0 0 0.

Also, wie kann ich das beheben ?? Vielen Dank.

Und das ist die Methode, die das Bild aus dem unfixierten Array retreive. Ist das richtig oder nicht?

private Image byteArrayToImage(ImageByteInfo imageArray){ 

     WritablePixelFormat<ByteBuffer> wf = PixelFormat.getByteBgraInstance(); 

     WritableImage writableimage = new WritableImage(imageArray.getWidth(), imageArray.getHeight()); 

     PixelWriter pixelWriter = writableimage.getPixelWriter(); 

     pixelWriter.setPixels(0, 0, imageArray.getWidth(), imageArray.getHeight(), wf, imageArray.getByteImage(), 0, 0); 

     return writableimage; 
    } 

Hinweis: Kein Interesse an Dateisystemspeicher, und es brauchen reine JavaFX (kein Schwingen oder AWT)

+0

Ich bin mir nicht sicher, warum Sie das Bedürfnis verspüren, ImageIO zu vermeiden, Sie speichern jedoch unkomprimierte Bytes. Willst du das wirklich? Bilder können sehr viel Platz einnehmen. – VGR

+1

@VGR gut Ich will Die Anwendung, die ich schreibe, um 100% JavaFX, kein AWT, kein Swing, auch wenn es nur eine Dienstprogramm-Codezeile ist (wie in diesem Fall). Und für die Bildkomprimierung. Das brauche ich jetzt nicht. vielleicht werde ich das in einer zukünftigen Version hinzufügen. – usertest

Antwort

2

In

pr.getPixels(0, 0, (int) i.getWidth(), (int) i.getHeight(), wf, buffer, 0, 0); 

das letzte Argument sein (die scanlineStride) ist der Offset in das Array, wenn Sie von einer Zeile zur nächsten Zeile im Bild fortschreiten. Da Sie ihn auf Null setzen, inkrementieren Sie den Array-Index nicht und schreiben nur eine "Zeile" des Arrays.

Da dieses Format 4 Bytes pro Pixel verwendet, benötigen Sie ein Scanline schreiten von 4*imageArray.getWidth():

pr.getPixels(0, 0, (int) i.getWidth(), (int) i.getHeight(), wf, buffer, 0, 4*imageArray.getWidth()); 

ähnlich

pixelWriter.setPixels(0, 0, imageArray.getWidth(), imageArray.getHeight(), wf, imageArray.getByteImage(), 0, 4*imageArray.getWidth()); 
+0

hh komisch, das habe ich schon probiert. aber ich habe vergessen, die Änderung in die entgegengesetzte Richtung anzuwenden. Vielen Dank, dass Sie diesen Schnitt hinzugefügt haben, ohne ihn würde das nicht funktionieren. Du bist ein kluger Mann. – usertest

Verwandte Themen