Java: Image conversion to byte[] array

Convertire un byte array (byte[]) in un oggetto Image e’ molto semplice:

	private Image convertToImage(byte[] source){
	Image objImage = new Image(source);
	return objImage;
}

Il contrario invece, convertire un oggetto Image in un byte[] non e’ proprio cosi’ immediaito. Ecco lo snippet che uso, che carica direttamente da una URL un’immagine e la memorizza in un byte[]. comodo magari da usare successivamente all’interno degli elementi di una jList.

private byte[] loadImageFromURL(String strUrl){
	int intPos;
	String strFileExt;

	//guess file extension
	intPos = strUrl.lastIndexOf(".");
	if (intPos >= 0){
		strFileExt = strUrl.substring(intPos + 1);
	}else{
		//assign default jpg extension
		strFileExt = "jpg";
	}

	try {
		//load the image from the Internet
		ImageIcon objImageIcon = new ImageIcon(new URL(strUrl));

		//wait the loading of the image
		MediaTracker objMediaTracker = new MediaTracker(lstContacts);
		objMediaTracker.addImage(objImageIcon.getImage(), 0);
		objMediaTracker.waitForID(0, 5000);

		//convert the image
		BufferedImage objBI = new BufferedImage(objImageIcon.getIconWidth(), objImageIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2 = objBI.createGraphics();
		g2.drawImage(objImageIcon.getImage(), 0, 0, null);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ImageIO.write(objBI, strFileExt, baos);

		return baos.toByteArray();

	} catch (MalformedURLException ex) {
		Logger.getLogger(MainForm.class.getName()).log(Level.SEVERE, null, ex);
		return null;
	} catch (IOException ex) {
		Logger.getLogger(MainForm.class.getName()).log(Level.SEVERE, null, ex);
		return null;
	} catch (InterruptedException ex) {
		Logger.getLogger(MainForm.class.getName()).log(Level.SEVERE, null, ex);
		return null;
	}
}

Altri esempi trovati comportano l’uso delle JAI, le Java Advanced Imaging API:

public static byte[] convertImage(Image img) {
	ParameterBlock pb = new ParameterBlock();
	pb.add(img) ;
	PlanarImage image = JAI.create("awtImage", pb,null);

	ByteArrayOutputStream stream = new ByteArrayOutputStream();

	JAI.create("encode", image, stream, "tiff");
	byte[] b = stream.toByteArray();
	return b;
}

In questo bonus script invece, viene ridimensionata un’immagine presente in un byte[] e viene restituita sottoforma di byte[] in formato jpg, pronto per essere salvata su file:

// iconData is the original array of bytes
ImageIcon imageIcon = new ImageIcon(iconData);
Image img = imageIcon.getImage();

Image imageResize = img.getScaledInstance(100, 100, 0);

ImageIcon imageIconResize = new ImageIcon (imageResize);

int resizeWidth = imageIconResize.getIconWidth();
int resizeHeight = imageIconResize.getIconHeight();

Panel p = new Panel();
BufferedImage bi = new BufferedImage(resizeWidth, resizeHeight,
BufferedImage.TYPE_INT_RGB);

Graphics2D big = bi.createGraphics();
big.drawImage(imageResize, 0, 0, p);

ByteArrayOutputStream os = new ByteArrayOutputStream();

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
encoder.encode(bi);
byte[] byteArray = os.toByteArray();

2 Comments

  1. ciao,
    sto provando ad usare il tuo metodo “loadImageFromURL(String strUrl)” per convertire un’immagine in un array di byte e salvarla in un database.
    al metodo non passo un url ma un path assoluto del file system: ho dunque ritoccato il metodo in:

    01 private byte[] readFile(String path){
    02
    03 String strFileExt=”jpg”;
    04
    05 try {
    06 ImageIcon objImageIcon = new ImageIcon(path);
    07
    08 BufferedImage objBI = new BufferedImage(objImageIcon.getIconWidth(), objImageIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
    09 Graphics2D g2 = objBI.createGraphics();
    10 g2.drawImage(objImageIcon.getImage(), 0, 0, null);
    11 ByteArrayOutputStream baos = new ByteArrayOutputStream();
    12 ImageIO.write(objBI, strFileExt, baos);
    13
    14 return baos.toByteArray();
    15
    16 } catch (IOException ex) {
    17 ex.printStackTrace();
    18 return null;
    19 }
    20 }

    (scusa la pessima formattazione).
    Ottengo però questa eccezione:
    javax.imageio.IIOException: Invalid argument to native writeImage
    relativa alla riga 12:
    12 ImageIO.write(objBI, strFileExt, baos);

    Sai aiutarmi?
    grazie

  2. Ciao,
    Se hai una bufferedImage puoi fare semplicemente:

    [java]
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    RenderedImage im = …;
    ImageIO.write(im, “png”, bout);

    byte[] bytes = bout.toByteArray();
    [/java]

Leave a Reply