【问题标题】:Optimal solution for Image scaling where i need to preserve aspect ratio and retain good quality图像缩放的最佳解决方案,我需要保持纵横比并保持良好的质量
【发布时间】:2019-11-30 08:23:09
【问题描述】:

所以问题来了:我正在加载一个分辨率未知的图像。我需要将其缩放到 500px 宽度以适应我的 UI,同时保持纵横比。图像质量必须好,因为我以后需要使用它,专门用于计算图像中两个对象之间的角度。

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

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

方法一:在 JavaFX 图像构造函数中使用 scale on load:

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);
}

这实现了所需的质量和缩放比例,但视图中包含的图像实际上并未缩放,这意味着稍后进行的计算使用的图像不代表正在显示的图像.

有没有办法我可以改变这些解决方案中的任何一个以更好地工作,或者我可以采取更好的方法吗?谢谢。

【问题讨论】:

  • 这是stackoverflow.com/questions/27894945/… 的副本。你可能不想平滑图像,所以设置更改构造函数new Image(path, 550, 412, true, false);
  • @SME_Dev 如果我在我的帖子中详细说明了该答案中的解决方案,我不确定这是如何重复的,并说明它们都对我有问题。而且我不明白您使用错误的布尔标志是什么意思。我的理解是我已将保留比率设置为 true 并选择了更高质量的处理算法?
  • 我刚刚尝试了您正在使用的代码和我拥有的图像,我注意到ImageViewImage 之间的质量没有视觉差异。在您edit 提出您的问题并按照已要求提供minimal reproducible example 以及您正在使用的图像以及您看到质量较低的位置的屏幕截图之前,我们真的无能为力了。跨度>

标签: java javafx


【解决方案1】:

你将不得不使用,

imageView.setSmooth(true);

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

编辑:

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

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

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

【讨论】:

  • 感谢您的回复,但是当我使用 imageView 进行缩放时,没有出现质量问题,它看起来就像我想要的那样。问题出现在我在图像构造函数中设置缩放的第一种方法中。我尝试使用您的解决方案,但质量仍然不如方法二。
猜你喜欢
  • 1970-01-01
  • 2010-11-25
  • 2013-03-04
  • 2015-07-31
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
相关资源
最近更新 更多