如何调整JavaFX图像的大小?

时间:2016-02-24 19:23:32

标签: java javafx

我有javafx.scene.image.Image,我想调整大小,例如按给定因子缩放它。怎么做(没有转换为BufferedImage),有关质量和性能的选项有哪些(例如插值类型)?

有几个问题看似相似,但我找不到任何提出同样问题的人。关键点是输入是Image对象(和缩放因子),所需的输出是另一个Image对象。

2 个答案:

答案 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.WritableImageImage扩展而来,目的是为了从内存数据创建图像。)

scale函数会读取source图像PixelReader中的像素,并且在对每个单独的源像素执行缩放操作后,会将像素写入target图像{{1 }}。实际实施将取决于所选算法。

换句话说,您需要实现自己的缩放算法。

请注意,这不是一项简单的操作,因为您需要进行上采样(目标较大)和下采样(目标较小)。您可以在Wikipedia

上找到图像缩放算法列表

最简单的算法之一是Nearest neighbour,但它会产生一些伪影。