【发布时间】:2010-08-04 14:24:15
【问题描述】:
我是 Java Advanced Imaging 的新手,遇到的第一个障碍是读取 12 位、单波段、灰度 JPEG 文件的能力。我已经看到对 JAI 的引用,但没有代码甚至没有关于应该如何完成的建议。有人可以通过有用的链接或短代码 sn-p 帮助我吗?
到目前为止,我一直在使用this tutorial,但它在这个问题上对我没有帮助。
谢谢。
【问题讨论】:
我是 Java Advanced Imaging 的新手,遇到的第一个障碍是读取 12 位、单波段、灰度 JPEG 文件的能力。我已经看到对 JAI 的引用,但没有代码甚至没有关于应该如何完成的建议。有人可以通过有用的链接或短代码 sn-p 帮助我吗?
到目前为止,我一直在使用this tutorial,但它在这个问题上对我没有帮助。
谢谢。
【问题讨论】:
JAI-ImageIO 会将自己注册到 Java 的 ImageIO api 中,因此您应该能够通过在类路径中使用 jai-imageio jar 并调用正常的 ImageIO 方法来使用它,例如 ImageIO.read(file)。
jpeg 的问题可能是 Java 在 IIORegistry 中有一个默认的 jpeg 阅读器,您可能必须使用 ImageIO.getImageReadersForFormatName() 等手动选择正确的阅读器。
另一个更深奥的格式是 JAI ImageIO 通常有两个实现 - 一个纯 Java 和另一个使用本机二进制库,因此请确保包含 *lib-wrapper.dll(或适合您特定操作系统的任何内容) 在 LD_LiBRARY_PATH 中或在程序的工作目录中。原生实现通常支持模式格式变体,而不是纯 java 的。
【讨论】:
我们通常使用 JAI + JAI Image I/O 读取 JPEG 12 位灰度图像。
除了之前的答案,还需要原生二进制库才能读取 JPEG 12bit,所以需要 mediaLib 库。
您只需要 Image I/O 中的“ImageRead”操作:
byte[] imageBytes = ...
RenderedOp readImage = JAI.create("ImageRead", new MemoryImageInputStream(imageBytes));
通常从 FTP 读取图像文件,因此获取 byte[] 并需要自定义 MemoryImageInputStream,通过子类化 ImageInputStreamImpl 将 byte[] 包装成 ImageInputStream。
【讨论】: