orkim okard
orkim okard

Reputation: 3

Any Alternative to ImageIO.write to convert bufferedimage to GIF bytes (Faster than ImageIO)?

my problem is when using imageio.write i am seeing that is using hdd, also read about jDeli (but too expensive), Apache Commons, JAI that are much faster....

I wanna use the encoded bytes returned by routine... at a custom Remote Desktop Utility...

public static byte[] imageToJPEGByteArray(Image aImage, int width, int height, int qualityPercent) throws IOException {
 byte[] imageBytes = new byte[0];
 

   float quality = 75 / 100f;

   BufferedImage destImage;
   destImage = SwingFXUtils.fromFXImage(aImage, null);
 
   // Output JPEG byte array
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
 
   if(qualityPercent != -1) {
       // Start to create JPEG with quality option
       ImageWriter writer = null;
       Iterator iter = ImageIO.getImageWritersByFormatName("gif");
       if (iter.hasNext()) {
         writer = (ImageWriter) iter.next();
       }
       ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
       writer.setOutput(ios); 
       ImageWriteParam iwparam = new JPEGImageWriteParam(Locale.getDefault());
       iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
       iwparam.setCompressionQuality(quality);
       writer.write(null, new IIOImage(destImage, null, null), iwparam);
       ios.flush();
       writer.dispose();
       ios.close();
       // Done creating JPEG with quality option
   } else {
       // This one line below created a JPEG file without quality option
       ImageIO.write(destImage, "gif", baos);
   }
 
   baos.flush();
   imageBytes = baos.toByteArray();
   baos.close();
 
   // Done
   return imageBytes; 
}

Upvotes: 0

Views: 548

Answers (1)

DuncG
DuncG

Reputation: 15186

If you are saying that you've observed that this code appears to cause disk activity when saving to ByteArrayOutputStream perhaps you should try setting the ImageIO "use cache" flag to false:

ImageIO.setUseCache(false);

Javadoc for setUseCache says:

Sets a flag indicating whether a disk-based cache file should be used when creating ImageInputStream and ImageOutputStreams.

Upvotes: 2

Related Questions