2010-07-09 18 views
52

Ich möchte ein Bild in Byte-Array konvertieren und umgekehrt. Hier wird der Benutzer den Namen des Bildes eingeben (.jpg) und das Programm wird lesen es aus der Datei und wird es in ein Byte-Array konvertieren.Wie konvertiert man Bild in Byte-Array in Java?

+5

Wahrscheinlich kein Duplikat: Die Frage Asker bedeutet komprimierte Bilddatei in Raster, nicht wie komprimierte Bytes zu lesen. –

+5

Zustimmen, das ist * nicht * ein Duplikat der markierten Frage (zumindest nicht unter Bezugnahme auf die angenommene Antwort). Abstimmung zum erneuten Öffnen – haraldK

+2

Dies ist kein Duplikat, da 'File' sich sehr stark von' Image' unterscheidet. –

Antwort

54
zum ersten lesen

BufferedImage besteht aus zwei Hauptklassen: Raster & ColorModel. Raster selbst besteht aus zwei Klassen, DataBufferByte für Bildinhalt während der andere für Pixelfarbe.

, wenn Sie die Daten aus DataBufferByte wollen, verwenden Sie:

public byte[] extractBytes (String ImageName) throws IOException { 
// open image 
File imgPath = new File(ImageName); 
BufferedImage bufferedImage = ImageIO.read(imgPath); 

// get DataBufferBytes from Raster 
WritableRaster raster = bufferedImage .getRaster(); 
DataBufferByte data = (DataBufferByte) raster.getDataBuffer(); 

return (data.getData()); 
} 

jetzt können Sie dieses Bytes verarbeiten, indem versteckten Text in lsb zum Beispiel, oder zu verarbeiten, wie Sie wollen.

+0

Wenn das Bild durch ein kurzes Array gesichert wird (was für mich und ein TIF-Bild der Fall war), erhalten Sie einen DataBufferShort, was zu einer Cast Exception – Karussell

+0

für diese Klassen führt. Benötige ich zusätzliche Jars? – praveen

+0

Nein, in Eclipse verwenden Sie einfach Strg + Shift + o. – RichardK

2

java.io.FileInputStream ist, was Sie für :-)

4

Check out javax.imageio, insbesondere ImageReader und ImageWriter als Abstraktion zum Lesen und Schreiben von Bilddateien suchen.

BufferedImage.getRGB(int x, int y) als Sie können RGB-Werte auf dem gegebenen Pixel erhalten, die in Bytes chunked werden können.

Hinweis: Ich denke, dass Sie nicht die rohen Bytes lesen möchten, weil Sie dann mit der ganzen Komprimierung/Dekompression umgehen müssen.

0

Ich denke, der beste Weg, dies zu tun, ist die Datei in einen Byte-Array, dann konvertiert das Array zu einem Bild mit ImageIO.read()

5

Versuchen Sie, diesen Code-Schnipsel

BufferedImage image = ImageIO.read(new File("filename.jpg")); 

// Process image 

ImageIO.write(image, "jpg", new File("output.jpg")); 
23
File fnew=new File("/tmp/rose.jpg"); 
BufferedImage originalImage=ImageIO.read(fnew); 
ByteArrayOutputStream baos=new ByteArrayOutputStream(); 
ImageIO.write(originalImage, "jpg", baos); 
byte[] imageInByte=baos.toByteArray(); 
41

Wenn Sie JDK 7 verwendet werden, können Sie den folgenden Code verwenden ..

import java.nio.file.Files; 
import java.io.File; 

File fi = new File("myfile.jpg"); 
byte[] fileContent = Files.readAllBytes(fi.toPath()) 
4

ist die komplette Version von Code, dies zu tun. Ich habe es getestet. Die BufferedImage und Base64 Klasse machen den Trick hauptsächlich. Auch einige Parameter müssen korrekt eingestellt sein.

public class SimpleConvertImage { 
    public static void main(String[] args) throws IOException{ 
     String dirName="C:\\"; 
     ByteArrayOutputStream baos=new ByteArrayOutputStream(1000); 
     BufferedImage img=ImageIO.read(new File(dirName,"rose.jpg")); 
     ImageIO.write(img, "jpg", baos); 
     baos.flush(); 

     String base64String=Base64.encode(baos.toByteArray()); 
     baos.close(); 

     byte[] bytearray = Base64.decode(base64String); 

     BufferedImage imag=ImageIO.read(new ByteArrayInputStream(bytearray)); 
     ImageIO.write(imag, "jpg", new File(dirName,"snap.jpg")); 
    } 
} 

Reference link

4

diesen Code Versuchen:

public class ImageTest { 

public static void main(String[] args) { 

    try { 

     byte[] imageInByte; 
     BufferedImage originalImage = ImageIO.read(new File(
       "c:/darksouls.jpg")); 

     // convert BufferedImage to byte array 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ImageIO.write(originalImage, "jpg", baos); 
     baos.flush(); 
     imageInByte = baos.toByteArray(); 
     baos.close(); 

     // convert byte array back to BufferedImage 
     InputStream in = new ByteArrayInputStream(imageInByte); 
     BufferedImage bImageFromConvert = ImageIO.read(in); 

     ImageIO.write(bImageFromConvert, "jpg", new File(
       "c:/new-darksouls.jpg")); 

    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } 
} 
} 
0

RandomAccessFile Mit einfachen und praktisch sein würde.

RandomAccessFile f = new RandomAccessFile(filepath, "r"); 
byte[] bytes = new byte[(int) f.length()]; 
f.read(bytes); 
f.close(); 
Verwandte Themen