2010-07-09 18 views
52

Voglio convertire un'immagine in array di byte e viceversa. Qui, l'utente inserirà il nome dell'immagine (.jpg) e il programma lo lo leggerà dal file e lo convertirà in un array di byte.come convertire l'immagine in array di byte in java?

+5

Probabilmente non un duplicato: il richiedente domanda significa file immagine compresso su raster, non su come leggere byte compressi. –

+5

D'accordo, questo * non * è un duplicato della domanda contrassegnata (almeno non facendo riferimento alla risposta accettata). Votazione per riaprire. – haraldK

+2

Questo non è un duplicato, poiché 'File' è molto diverso da' Immagine'. –

risposta

54

BufferedImage è costituito da due classi principali: Raster & ColorModel. Raster si compone di due classi, DataBufferByte per il contenuto dell'immagine, mentre l'altro per il colore dei pixel.

se si desidera che i dati da DataBufferByte, uso:

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()); 
} 

ora è in grado di elaborare questi byte nascondendosi testo in lsb per esempio, o un processo nel modo che si desidera.

+0

se l'immagine è sottoposta a un breve array (che era il caso per me e un'immagine tif) ti darà un DataBufferShort risultante in un'eccezione cast – Karussell

+0

per queste classi ho bisogno di qualche barattolo in più? – praveen

+0

No, in Eclipse basta usare Ctrl + Shift + o. – RichardK

2

java.io.FileInputStream è quello che stai cercando per :-)

4

Partenza javax.imageio, soprattutto ImageReader e ImageWriter come un'astrazione per la lettura e la scrittura di file di immagine.

BufferedImage.getRGB(int x, int y) di consente di ottenere valori RGB sul pixel indicato, che può essere suddiviso in byte.

Nota: penso che non si vogliano leggere i byte non elaborati, perché in questo caso si deve gestire tutta la compressione/decompressione.

0

Penso che il modo migliore per farlo è quello di leggere prima il file in un array di byte, quindi convertire l'array ad un'immagine con ImageIO.read()

5

Prova questo frammento di codice

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

Se si utilizza JDK 7 è possibile utilizzare il seguente codice ..

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

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

Ecco una versione completa di codice per fare questo. L'ho provato Le classi BufferedImage e Base64 fanno il trucco principalmente. Inoltre alcuni parametri devono essere impostati correttamente.

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

Prova di questo codice:

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

Utilizzando RandomAccessFile sarebbe semplice e pratico.

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