У меня возникают трудности с использованием API Java JAI (Java Advance Imaging) для изменения разрешения изображения JPEG с, скажем, 1024x800 до 512x400.

Я поигрался с API и продолжаю получать исключения потока или java.lang.OutOfMemory.

Всем, у кого есть рабочий пример.

1
Koekiebox 24 Авг 2009 в 23:02

2 ответа

Лучший ответ

Вот рабочий пример, поставленный «как есть», без гарантии :)

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;
}
2
skaffman 24 Авг 2009 в 23:08
Ах, засранец, ты прав. Я бы удалил ответ, но он уже принят. Вместо этого я буду голосовать за вашу.
 – 
skaffman
24 Авг 2009 в 23:49

Вот один, использующий 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)
    {
    }
}
4
Jesse 24 Авг 2009 в 23:46