如何用Java中的JPEG创建缩略图?

39 java jpeg image

有人可以帮助一些代码来创建Java中的JPEG缩略图.

我是新手,所以一步一步的解释将不胜感激.

Sav*_*sis 70

Image img = ImageIO.read(new File("test.jpg")).getScaledInstance(100, 100, BufferedImage.SCALE_SMOOTH);
Run Code Online (Sandbox Code Playgroud)

这将创建一个100x100像素的缩略图作为Image对象.如果要将其写回磁盘,只需将代码转换为:

BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
img.createGraphics().drawImage(ImageIO.read(new File("test.jpg")).getScaledInstance(100, 100, Image.SCALE_SMOOTH),0,0,null);
ImageIO.write(img, "jpg", new File("test_thumb.jpg"));
Run Code Online (Sandbox Code Playgroud)

此外,如果您担心速度问题(如果您想缩放许多图像,上述方法相当慢)请使用以下方法和以下声明:

private BufferedImage scale(BufferedImage source,double ratio) {
  int w = (int) (source.getWidth() * ratio);
  int h = (int) (source.getHeight() * ratio);
  BufferedImage bi = getCompatibleImage(w, h);
  Graphics2D g2d = bi.createGraphics();
  double xScale = (double) w / source.getWidth();
  double yScale = (double) h / source.getHeight();
  AffineTransform at = AffineTransform.getScaleInstance(xScale,yScale);
  g2d.drawRenderedImage(source, at);
  g2d.dispose();
  return bi;
}

private BufferedImage getCompatibleImage(int w, int h) {
  GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
  GraphicsDevice gd = ge.getDefaultScreenDevice();
  GraphicsConfiguration gc = gd.getDefaultConfiguration();
  BufferedImage image = gc.createCompatibleImage(w, h);
  return image;
}
Run Code Online (Sandbox Code Playgroud)

然后打电话:

BufferedImage scaled = scale(img,0.5);
Run Code Online (Sandbox Code Playgroud)

其中0.5是比例,img是包含正常大小图像的BufferedImage.

  • @jacktrades不,不会.您可以使用`ImageIO.write()`方法将其写回磁盘.我知道,评论很老,但对于那些与杰克有同样问题的人来说. (2认同)

Riy*_*lla 32

你可能已经发现"简单"和"好看的结果"是两个非常不同的东西.我已将这两个要求封装到一个非常简单的Java图像缩放库(Apache 2许可证)中,它只能为您完成所有操作.

创建缩略图的示例代码如下所示:

BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, 150);
Run Code Online (Sandbox Code Playgroud)

您的图像比例很受尊重,图书馆会根据图像因缩放(FASTEST,BALANCED或QUALITY)而发生的变化量对其应该使用的方法进行最佳猜测,并且总是使用最佳支持的Java2D图像类型缩放以避免出现"黑色"结果或看起来非常糟糕的输出(例如过度抖动的GIF图像).

此外,如果要强制它在Java中输出可能最佳的缩略图,API调用将如下所示:

BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY, 
                                       150, 100, Scalr.OP_ANTIALIAS);
Run Code Online (Sandbox Code Playgroud)

库不仅会使用Java2D推荐的增量缩放来为您提供最佳效果,它还会对缩略图(带有非常微调的内核的ConvolveOp)应用可选的抗锯齿效果,以便每次都轻微地软化像素值之间的转换使缩略图看起来更加均匀,而不是像从非常大的图像到非常小的图像时看到的那样锐利或罂粟.

您可以阅读库中的所有注释(代码本身是大量文档),以查看所有不同的JDK错误或为改善性能或内存使用而进行的优化.我花了很多时间来调整这个实现,并且在Web应用程序和其他Java项目中部署它的人们收到了很多很好的反馈.


Ali*_*ran 12

这是创建100 X 100缩略图的简单方法,图像中没有任何拉伸或歪斜.

private  void saveScaledImage(String filePath,String outputFile){
    try {

        BufferedImage sourceImage = ImageIO.read(new File(filePath));
        int width = sourceImage.getWidth();
        int height = sourceImage.getHeight();

        if(width>height){
            float extraSize=    height-100;
            float percentHight = (extraSize/height)*100;
            float percentWidth = width - ((width/100)*percentHight);
            BufferedImage img = new BufferedImage((int)percentWidth, 100, BufferedImage.TYPE_INT_RGB);
            Image scaledImage = sourceImage.getScaledInstance((int)percentWidth, 100, Image.SCALE_SMOOTH);
            img.createGraphics().drawImage(scaledImage, 0, 0, null);
            BufferedImage img2 = new BufferedImage(100, 100 ,BufferedImage.TYPE_INT_RGB);
            img2 = img.getSubimage((int)((percentWidth-100)/2), 0, 100, 100);

            ImageIO.write(img2, "jpg", new File(outputFile));    
        }else{
            float extraSize=    width-100;
            float percentWidth = (extraSize/width)*100;
            float  percentHight = height - ((height/100)*percentWidth);
            BufferedImage img = new BufferedImage(100, (int)percentHight, BufferedImage.TYPE_INT_RGB);
            Image scaledImage = sourceImage.getScaledInstance(100,(int)percentHight, Image.SCALE_SMOOTH);
            img.createGraphics().drawImage(scaledImage, 0, 0, null);
            BufferedImage img2 = new BufferedImage(100, 100 ,BufferedImage.TYPE_INT_RGB);
            img2 = img.getSubimage(0, (int)((percentHight-100)/2), 100, 100);

            ImageIO.write(img2, "jpg", new File(outputFile));
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
Run Code Online (Sandbox Code Playgroud)