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]