缓冲图像大小调整

2022-08-31 20:08:43

我正在尝试调整缓冲区图像的大小。我能够存储它并显示在jframe上没有问题,但我似乎无法调整它的大小。关于如何更改它以使其工作并将图像显示为200 * 200文件的任何提示都将很棒

private void profPic(){
    String path = factory.getString("bottle");
    BufferedImage img = ImageIO.read(new File(path));
}


public static BufferedImage resize(BufferedImage img, int newW, int newH) {  
    int w = img.getWidth();  
    int h = img.getHeight();  
    BufferedImage dimg = new BufferedImage(newW, newH, img.getType());  
    Graphics2D g = dimg.createGraphics();  
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BILINEAR);  
    g.drawImage(img, 0, 0, newW, newH, 0, 0, w, h, null);  
    g.dispose();  
    return dimg;  
}  

答案 1

更新的答案

我不记得为什么我原来的答案有效,但是在一个单独的环境中测试了它,我同意,原来的接受的答案不起作用(为什么我说它起作用,我也不记得了)。另一方面,这确实有效:

public static BufferedImage resize(BufferedImage img, int newW, int newH) { 
    Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
    BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);

    Graphics2D g2d = dimg.createGraphics();
    g2d.drawImage(tmp, 0, 0, null);
    g2d.dispose();

    return dimg;
}  

答案 2

如果只需要在方法中调整 a 的大小,则缩略图器库可以相当容易地执行此操作:BufferedImageresize

public static BufferedImage resize(BufferedImage img, int newW, int newH) {
  return Thumbnails.of(img).size(newW, newH).asBufferedImage();
}

上面的代码将调整大小以适合原始图像的尺寸,同时保持原始图像的纵横比。imgnewWnewH

如果不需要保持纵横比,并且需要调整大小以精确到给定的尺寸,则可以使用该方法代替该方法:forceSizesize

public static BufferedImage resize(BufferedImage img, int newW, int newH) {
  return Thumbnails.of(img).forceSize(newW, newH).asBufferedImage();
}

使用 Image.getScaledInstance 方法不能保证调整后的图像将保持原始图像的纵横比,而且,它通常非常慢。

缩略图器使用一种技术来逐步调整图像大小,该技术可能比Image.getScaledInstance快几倍,同时实现通常相当的图像质量。

免责声明:我是这个库的维护者。


推荐