【问题标题】:What is the difference between the ways to read an Image file in Java?Java中读取图像文件的方式有什么区别?
【发布时间】:2012-12-17 16:07:10
【问题描述】:

在 java 中有多种读取图像文件的方法,例如 BufferedImageImageIcon 等等。我想知道这些案例有什么区别?它们是否依赖于上下文,在特定情况下只能使用其中一个?

读取用户JFileChooser 选择的图像并分离图像的颜色通道的最佳方法是什么?

【问题讨论】:

  • "在 java 中读取图像文件,例如 BufferedImage" BufferedImage API 没有提供读取图像的方法。 DYM javax.imageio.ImageIOjava.awt.Toolkit?

标签: java image image-processing bufferedimage color-channel


【解决方案1】:

一个好方法是使用不同的 ImageIO.read 方法,它返回 BufferedImage 对象。

Image 是一个抽象类,所以我认为真正的问题是哪个子类对您的程序更有效。如果您需要硬件加速,请使用 VolatileImage。更多关于 here.

【讨论】:

  • 同意,ImageIO 是可行的方法(至少在不使用 JavaFX 时)。
  • @Gimby:使用 JavaFX 时你会怎么做?
【解决方案2】:

ImageIcon(和Toolkit#createImage/Toolkit#getImage)使用后台加载过程。也就是说,调用这些方法后,它们会立即返回,并创建了一个后台线程来实际加载图像数据。

这些在通过慢速连接加载大图像时使用过,例如旧的 28k 调制解调器(啊,我记得那些日子)。这意味着您的应用程序可以在下载图像时继续运行。

您会在Graphics 类中发现drawImage 方法接受ImageObserver 接口并且java.awt.Component 实现了该接口,这使得组件能够在图像实际完成加载后自动更新自身。

另一方面,ImageIO 在图像完全加载之前不会返回。它还可以更轻松地引入新的读取器/写入器,使 API 比原始 API 更加灵活。 ImageIO 还支持更广泛的开箱即用图像。

BufferedImage 也是一个更加灵活的图像类,尤其是在对图像应用效果时。

现在,我个人更喜欢ImageIO。如果我知道我正在通过可能很慢的连接加载大图像或图像,我将创建自己的后台线程来加载它们。虽然有点复杂,但权衡大大超过了少量额外工作的重量 - 恕我直言

读取用户通过 JFileChooser 选择的图像并分离图像的颜色通道的最佳方法是什么?

ImageIO 毫无疑问。为了对使用 ImageIcon 加载的图像进行任何认真的操作,无论如何您都必须将该图像转换为 BufferedImage

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 2013-09-08
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多