tags:

views:

337

answers:

2

Hi,

I am having difficulty using the Java JAI (Java Advance Imaging) API to change the resolution of a JPEG image from lets say 1024x800 to 512x400.

I have played around with the API and keep receiving stream or outofmem exceptions.

Anyone with a working example.

Thanks

+1  A: 

Here's a working example, supplied on an "as is" basis with no warranty :)

BufferedImage scaleImage(BufferedImage sourceImage, int scaledWidth) {
   float scale = scaledWidth / (float) sourceImage.getWidth();
   int scaledHeight = (int) (sourceImage.getHeight() * scale);
   Image scaledImage = sourceImage.getScaledInstance(
      scaledWidth, 
      scaledHeight, 
      Image.SCALE_AREA_AVERAGING
   );

   BufferedImage bufferedImage = new BufferedImage(
      scaledImage.getWidth(null), 
      scaledImage.getHeight(null), 
      BufferedImage.TYPE_INT_RGB
   );
   Graphics g = bufferedImage.createGraphics();
   g.drawImage(scaledImage, 0, 0, null);
   g.dispose();

   return bufferedImage;
}
skaffman
This is AWT, isn't it?
Jesse
Ah, bugger, you're right. I'd delete the answer, but it's already been accepted. I'll upvote yours instead.
skaffman
+4  A: 

Here's one using JAI

public void resize(String filename, RenderedOp image, double wScale, double hScale)
{
 // now resize the image
 ParameterBlock pb = new ParameterBlock();
 pb.addSource(image); // The source image
 pb.add(wScale); // The xScale
 pb.add(hScale); // The yScale
 pb.add(0.0F); // The x translation
 pb.add(0.0F); // The y translation

 RenderingHints hints = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);  
 RenderedOp resizedImage = JAI.create("SubsampleAverage", pb, hints);

 // lastly, write the newly-resized image to an
 // output stream, in a specific encoding
 try
 {
  FileOutputStream fos = new FileOutputStream(new File(filename));
  JAI.create("encode", resizedImage, fos, getImageType(filename), null);
 }
 catch (FileNotFoundException e)
 {
 }
}
Jesse