需要保持宽高比并保持高质量的图像缩放的最佳解决方案

时间:2019-07-22 11:03:37

标签: java javafx

这是问题所在:我正在加载分辨率未知的图像。我需要将其缩放到500px的宽度以适合我的UI,同时保持宽高比。图像质量必须很好,因为我以后需要使用它,特别是要计算图像中两个对象之间的角度。

到目前为止,我已经尝试了以下方法:

  

在以下示例中,我们有一个现有的UI元素ImageView imageView;

方法一:在JavaFX图像构造函数中使用负载缩放:

public void setImage(String path){
    Image image = new Image(path, 550, 412, true, true);
    imageView.setImage(image);
}

该方法可以实现所需的缩放比例,但是缺乏稍后精确计算角度所需的质量。

方法二:使用ImageView缩放来缩放显示的图像:

public void setImage(String path){
    Image image = new Image(path);
    imageView.setFitWidth(550);
    imageView.setPreserveRatio(true);
    imageView.setImage(image);
}

这可以达到所需的质量和缩放比例,但是视图中包含 的图像实际上并未缩放,这意味着该行后面的计算使用的是不代表所显示图像的图像

我是否可以通过改变这些解决方案来更好地工作,还是可以采取更好的方法?谢谢。

1 个答案:

答案 0 :(得分:0)

您将不得不使用

imageView.setSmooth(true);

在缩放后获得更好的图像质量。

编辑:

这是因为,这两种方法本质上是不同的。第一种方法首先加载质量较差的图像(像素较少)。您可以尝试的一件事是,使用ImageIO使用AWT Image类来加载图像,然后调用scaledImage = image.getScaledInstance(width, height)。然后使用类似(伪代码-从内存中写入)的内容:

  1. 创建缩放大小的bufferedImage
  2. bufferedImage.createGraphics() .drawImage(scaledImage, 0, 0, null)

获取缩放的AWT图像。然后使用SwingFXUtils转换为FX应用程序的图像。通过链接方法,可以用3行代码完成整个过程。在以前的一个项目中,我能够以此方式获得更好的质量。