Java Graphics2D 插值似乎不适用于调整大小的图像

标签 java image resize graphics2d smoothing

我想将图像调整为适合缩略图的较小尺寸并将其导出。问题是结果图像看起来非常糟糕,有很多可见的锯齿,就好像它使用的是非常简单的算法一样。

我读过很多关于此的文章,建议使用渲染提示来启用质量渲染和双三次插值,但它们似乎不会影响任何东西,就好像它们不适用于最终图像一样。我还尝试了抗锯齿提示(也不起作用),但我猜它们是用于绘图的。

为了简单起见,我将仅显示执行调整大小和写入的代码,并且我将为结果图像添加硬编码尺寸。

    final BufferedImage imageOriginal = ImageIO.read(new File("/some-path/arch3.jpg"));
int newWidth = 267, newHeight = 400;
    BufferedImage imageResized = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = (Graphics2D) imageResized.getGraphics();
    g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    g2d.drawImage(imageOriginal, 0, 0, imageResized.getWidth(), imageResized.getHeight(), 0, 0, imageOriginal.getWidth(), imageOriginal.getHeight(), null);

     try {
         ImageIO.write(imageResized, "jpg", new File("/some-path/arch3_converted.jpg"));
     } catch (Exception ioException) {
       System.out.println(ioException.toString());
     } 

这是原始图像:https://drive.google.com/open?id=1qsZFQWWneBlHAahV2s5CwlxlCYvnHiU8 (4480×6720) 这是转换后的结果:https://drive.google.com/open?id=1WEcYb7QRlurOK-_dHr_BAk1HrLxPkdIl (267x400) 正如您在结果中看到的那样(尤其是在线条上),它似乎不正确。

最佳答案

使用“image.getScaledInstance”

 String imgOriginalPath= "arch3.jpg";          
 String imgTargetPath= "arch3_resize.jpg"; 
 String imgFormat = "jpg";                          
 int newWidth = 200;                                  
 int newHeight = 300;                                 

 try{
    Image image = ImageIO.read(new File(imgOriginalPath));
    Image resizeImage = image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
    BufferedImage newImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
    Graphics g = newImage.getGraphics();
    g.drawImage(resizeImage, 0, 0, null);
    g.dispose();
    ImageIO.write(newImage, imgFormat, new File(imgTargetPath));
 }catch (Exception e){e.printStackTrace();}

我测试了一下,效果很好。我希望你也喜欢它。 :)

关于Java Graphics2D 插值似乎不适用于调整大小的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56804144/

相关文章:

iphone - 我的 UITableViewCell 中的 UIImageView 在单击时更改大小

resize - 使用 Mogrify 执行调整大小和填充 Canvas

java - 当我运行代码时,菜单显示为垂直而不是水平,我该如何更改它?

java - 线程进度条 fragment

html - 建议将图像和文本编码到已部署的 HTML 页面...

java - 向 JFrame 添加背景

java - 在 Clojure 或 Java 中使用正则表达式时,如何使用命名捕获组?

Java 7 JDK 自动更新

python - 读取两个图像作为一个图像Python

html - 如何在不弄乱表格结构的情况下自动调整表格的高度?