【问题标题】:How can I resize a JavaFX image?如何调整 JavaFX 图像的大小?
【发布时间】:2016-02-24 19:23:32
【问题描述】:

我有一个javafx.scene.image.Image,我想调整它的大小,例如按给定因子缩放它。如何做到这一点(不转换为BufferedImage),以及关于质量和性能的选项(例如插值类型)有哪些?

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

【问题讨论】:

  • 你想对缩放后的图像做什么?通常在 JavaFX 中,您会在 ImageView 中显示 Image,它提供 functionality to scale the image it displays(或者您可以 scale the image on loading directly)。您当然可以始终加载和缩放图像,然后对包含它的ImageView 进行快照;那行得通吗?
  • @James_D 我可以显示它,将其保存到文件或以任何其他可能的方式使用它。例如,我可能会在内存中保留一个缩小的图像,以便以后显示。我想快照可以工作。
  • 要将其保存到文件中,无论如何您都需要将其转换为缓冲图像,因此也许转换是要走的路。

标签: java javafx


【解决方案1】:

最简单的方法是这样的:

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(...);(使用具有更好平滑性的较慢算法和false 使用具有更好平滑性的更快算法)调用imageView.setSmooth(...); 可以实现对缩放算法的速度/平滑度的最小控制平滑。

【讨论】:

    【解决方案2】:

    如果不将其转换为BufferedImage,您将需要实现缩放算法并执行以下操作:

    Image source = ...
    WritableImage target = new WritableImage(targetWidth, targetHeight)
    
    scale(target, source)
    

    (请注意,javafx.scene.image.WritableImage 是从 Image 扩展而来的,旨在从内存数据中创建图像。)

    scale 函数将从source 图像PixelReader 读取像素,并在对每个单独的源像素进行缩放操作后,将像素写入target 图像PixelWriter。实际实现将取决于所选算法。

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

    请注意,这不是简单的操作,因为您需要计算上采样(目标较大)和下采样(目标较小)。您可以在Wikipedia上找到图像缩放算法列表

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-24
      • 2014-12-11
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      相关资源
      最近更新 更多