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