Java: определение формата изображения, изменение размера (масштабирование) и сохранение в формате JPEG - PullRequest
9 голосов
/ 30 апреля 2010

Это код, который у меня есть, он на самом деле работает, не идеально, но работает, проблема в том, что уменьшенные миниатюры не вставляются в белый нарисованный прямоугольник, нарушая соотношение сторон изображения, вот код, может кто-то предложить мне исправить это, пожалуйста?

Спасибо

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ImageScalerImageIoImpl implements ImageScaler {

 private static final String OUTPUT_FORMAT_ID = "jpeg";

 // Re-scaling image
 public byte[] scaleImage(byte[] originalImage, int targetWidth,
   int targetHeight) {

  try {
   InputStream imageStream = new BufferedInputStream(
     new ByteArrayInputStream(originalImage));
   Image image = (Image) ImageIO.read(imageStream);

   int thumbWidth = targetWidth;
   int thumbHeight = targetHeight;

   // Make sure the aspect ratio is maintained, so the image is not skewed
         double thumbRatio = (double)thumbWidth / (double)thumbHeight;
         int imageWidth = image.getWidth(null);
         int imageHeight = image.getHeight(null);
         double imageRatio = (double)imageWidth / (double)imageHeight;
         if (thumbRatio < imageRatio) {
           thumbHeight = (int)(thumbWidth / imageRatio);
         } else {
           thumbWidth = (int)(thumbHeight * imageRatio);
         }

   // Draw the scaled image
   BufferedImage thumbImage = new BufferedImage(thumbWidth,
     thumbHeight, BufferedImage.TYPE_INT_RGB);
   System.out.println("Thumb width Buffered: " + thumbWidth + " || Thumb height Buffered: " + thumbHeight);

   Graphics2D graphics2D = thumbImage.createGraphics();
   // Use of BILNEAR filtering to enable smooth scaling
   graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
     RenderingHints.VALUE_INTERPOLATION_BILINEAR);
   // graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);

   // White Background
   graphics2D.setPaint(Color.WHITE);
   graphics2D.fill(new Rectangle2D.Double(0, 0, targetWidth,
     targetHeight));
   graphics2D.fillRect(0, 0, targetWidth, targetHeight);

   System.out.println("Target width: " + targetWidth + " || Target height: " + targetHeight);

   // insert the resized thumbnail between X and Y of the image 
   graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);

   System.out.println("Thumb width: " + thumbWidth + " || Thumb height: " + thumbHeight);

   // Write the scaled image to the outputstream
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   ImageIO.write(thumbImage, OUTPUT_FORMAT_ID, out);
   return out.toByteArray();

  } catch (IOException ioe) {
   throw new ImageResizingException(ioe);
  }
 }

}

1 Ответ

10 голосов
/ 30 апреля 2010

Вы можете легко масштабировать свое изображение, используя Image s getScaledInstance метод:

BufferedImage img = ImageIO.read(new File("image.jpg"));
int scaleX = (int) (img.getWidth() * 0.5);
int scaleY = (int) (img.getHeight() * 0.5);

Image newImg = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH);

Как только вы получите масштабированный Image, вы можете «преобразовать» его обратно в BufferedImage, как описано здесь .

Наконец, используйте класс ImageIO, чтобы записать свой BufferedImage в файл.

...