【问题标题】:Java Handling TIF ImagesJava 处理 TIF 图像
【发布时间】:2013-11-15 22:18:01
【问题描述】:

我的问题是,我怎样才能成功地将 .tif 文件加载到 Java 中的 Image 实例中?

现在让我提供一些更详细的信息。我在 stackoverflow 上阅读了很多关于如何在 Java 中处理/转换 TIF 图像的线程。我已经尝试了很多 stackoverflow 的建议(我说的是建议,因为很少有人问回来说某些东西对他们有用)。我很确定我需要使用 Java Advanced Imaging (JAI) 库,但我认为我不知道如何使用它。现在让我解释一下这个项目:

我正在从处理草图中获取帧屏幕,并使用 Xuggler 将它们编码为视频。在草图中,我使用 Processing 的 save(file filePath) 函数将当前帧保存到文件中。我曾经有 save("img"+i+".jpg"),但是创建 jpg 时发生的压缩将录制速度减慢到 9-10fps,所以我切换了文件扩展名看看我是否能得到不同的结果,save("img"+i".tif") 是最快的,让我能以大约 22-23fps 的速度录制。

处理可以将图像保存为 .tif 文件。不幸的是,Java 无法在没有库的情况下重新加载 .tif 文件。我以前有代码:
图像 img = Toolkit.getDefaultToolkit().getImage("pics/img"+i+".jpg");
那行代码会将 .jpg 文件加载到 img 中,我最好对视频进行编码。但是这行代码(tif而不是jpg):
图像 img = Toolkit.getDefaultToolkit().getImage("pics/img"+i+".tif");
不会加载任何图像。我仍然可以使用 Xuggler 对我的视频进行编码,但是图像是空白的,所以我认为这种方法无法加载我的 .tif 文件。

我正在使用 Windows 8 计算机,并使用 Eclipse。任何帮助将不胜感激!

【问题讨论】:

    标签: java image tiff javax.imageio


    【解决方案1】:

    您不需要使用 JAI。我建议您使用普通的 ImageIO API 和 TIFF 插件。

    对于 Java 9 及更高版本,一个基本的 TIFF 插件与 JDK 捆绑在一起。对于早期版本,或者如果您需要更高级的功能,还有其他几个适用于 ImageIO 的 TIFF 插件可用,根据您的需要,您可以使用来自 jai-imageio、我的TIFF plugin 或其他一些第三方插件的一个。

    我的插件支持最常见的 TIFF 类型。与 jai-imageio 相比,不需要本机库。您可以将 Maven 依赖项添加到您的项目中,也可以直接从 this link 下载。

    使用 ImageIO API 的好处是,在正确安装插件后,您需要做的就是:

    BufferedImage img = ImageIO.read("pics/img"+i+".tif"); 
    

    【讨论】:

    • 简单地添加到 pom.xml(来自 Maven Central)后立即工作。即使是 16 位 TIFF 图像。辛苦了,谢谢!
    【解决方案2】:

    是的,你需要JAI

      import javax.media.jai.PlanarImage;
      import com.sun.media.jai.codec.ByteArraySeekableStream;
      import com.sun.media.jai.codec.ImageCodec;
      import com.sun.media.jai.codec.ImageDecoder;
      import com.sun.media.jai.codec.SeekableStream;
      import java.awt.Image;
      import java.awt.image.RenderedImage;
    ...
      static Image load(byte[] data) throws Exception{
        Image image = null;
        SeekableStream stream = new ByteArraySeekableStream(data);
        String[] names = ImageCodec.getDecoderNames(stream);
        ImageDecoder dec = 
          ImageCodec.createImageDecoder(names[0], stream, null);
        RenderedImage im = dec.decodeAsRenderedImage();
        image = PlanarImage.wrapRenderedImage(im).getAsBufferedImage();
        return image;
      }
    

    【讨论】:

    • 我现在有了 JAI,我已经构建了路径,并且我已经编写了 load(byte[] data)。如何使用负载(字节 [] 数据)?我有文件路径“pics/img”+i+“.tif”,我该如何(如果这是我必须做的)将其更改为类型 byte[]?或者我应该输入什么作为参数?再次感谢。
    • 没关系,我想出了如何将 .tif 文件更改为字节数组。我现在正在完美地编码视频。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2015-05-10
    相关资源
    最近更新 更多