2010-07-09 23 views
52

Quiero convertir una imagen en matriz de bytes y viceversa. Aquí, el usuario ingresará el nombre de la imagen (.jpg) y el programa será léelo desde el archivo y lo convertirá en una matriz de bytes.cómo convertir imágenes en matriz de bytes en java?

+5

Probablemente no es un duplicado: La pregunta asker significa archivo de imagen comprimida en ráster, no cómo leer los bytes comprimidos. –

+5

De acuerdo, este es * no * un duplicado de la pregunta marcada (al menos no refiriéndose a la respuesta aceptada). Votando para reabrir – haraldK

+2

Esto no es un duplicado, ya que 'File' es muy diferente de' Image'. –

Respuesta

54

BufferedImage consta de dos clases principales: Raster & ColorModel. Raster en sí consiste en dos clases, DataBufferByte para el contenido de la imagen, mientras que el otro para el color del píxel.

si desea que los datos de DataBufferByte, utilice:

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

Ahora puede procesar estos bytes al ocultar texto en LSB por ejemplo, o el proceso de la manera que desee.

+0

si la imagen está respaldada por una matriz corta (que fue el caso para mí y una imagen tif), le dará un DataBufferShort que da como resultado una excepción de conversión – Karussell

+0

para estas clases ¿necesito algún jarrón adicional? – praveen

+0

No, en Eclipse simplemente use Ctrl + Shift + o. – RichardK

2

java.io.FileInputStream es lo que estás buscando :-)

4

Salida javax.imageio, especialmente ImageReader y ImageWriter como una abstracción para leer y escribir archivos de imagen.

BufferedImage.getRGB(int x, int y) que le permite obtener valores RGB en el píxel dado, que se pueden dividir en bytes.

Nota: Creo que no quiere leer los bytes sin formato, porque entonces tiene que ocuparse de toda la compresión/descompresión.

0

Creo que la mejor manera de hacerlo es leer primero el archivo en una matriz de bytes, a continuación, convertir la matriz a una imagen con ImageIO.read()

5

Prueba este fragmento de código

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

Si está utilizando JDK 7 se puede utilizar el siguiente código ..

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

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

Aquí es una versión completa del código para hacer esto. Lo he probado La clase BufferedImage y Base64 hacen el truco principalmente. Además, algunos parámetros deben configurarse correctamente.

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

Prueba este código:

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

Usando RandomAccessFile sería simple y práctico.

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