我有javafx.scene.image.Image
,我想调整大小,例如按给定因子缩放它。怎么做(没有转换为BufferedImage
),有关质量和性能的选项有哪些(例如插值类型)?
有几个问题看似相似,但我找不到任何提出同样问题的人。关键点是输入是Image
对象(和缩放因子),所需的输出是另一个Image
对象。
答案 0 :(得分:10)
最简单的方法是:
public Image scale(Image source, int targetWidth, int targetHeight, boolean preserveRatio) {
ImageView imageView = new ImageView(source);
imageView.setPreserveRatio(preserveRatio);
imageView.setFitWidth(targetWidth);
imageView.setFitHeight(targetHeight);
return imageView.snapshot(null, null);
}
通过调用值为imageView.setSmooth(...);
的{{1}},使用较慢的算法和更好的平滑处理true
,可以对缩放算法的速度/平滑度进行最小程度的控制。使用更快的算法,减少平滑。
答案 1 :(得分:1)
如果不将其转换为BufferedImage
,您需要实现缩放算法并执行以下操作:
Image source = ...
WritableImage target = new WritableImage(targetWidth, targetHeight)
scale(target, source)
(请注意,javafx.scene.image.WritableImage
从Image
扩展而来,目的是为了从内存数据创建图像。)
scale
函数会读取source
图像PixelReader
中的像素,并且在对每个单独的源像素执行缩放操作后,会将像素写入target
图像{{1 }}。实际实施将取决于所选算法。
换句话说,您需要实现自己的缩放算法。
请注意,这不是一项简单的操作,因为您需要进行上采样(目标较大)和下采样(目标较小)。您可以在Wikipedia
上找到图像缩放算法列表最简单的算法之一是Nearest neighbour,但它会产生一些伪影。