我正在尝试创建一个 Grails 应用程序,它可以显示 TIFF 文件和其他图像的预览。
背景
这些图像是从一个 SOAP 服务构造的,该服务为我提供了图像的字节。在服务方法中,我获取 byte[],从中构造一个 ByteArrayInputStream,然后从中创建一个 BufferedImage。
def inputStream = new ByteArrayInputStream(bytes)
BufferedImage originalImage = ImageIO.read(inputStream)
ImageIO.write(originalImage, 'png', response.outputStream)
对于 JPG,我可以通过这种方式轻松地将图像作为 img 标签的 src 流式传输到浏览器。但是,TIFF 需要将图像转换为其他格式(最好是 JPG 或 PNG),以使它们成为标签的 src。
问题
我知道我需要 JAI 才能读取 TIFF 文件。jai_core.jar、jai_codec.jar 文件在我的类路径中。事实上,因为我在 Mac OSX 上,它们是自动安装的。但是,当我运行 grails 应用程序并尝试从从 SOAP 服务接收到的字节构造 TIFF 图像时,我收到此错误:
| Error 2013-06-18 15:23:38,135 [http-bio-8080-exec-10] ERROR errors.GrailsExceptionResolver - IllegalArgumentException occurred when processing request: [GET] /BDMPlugin/BDMPlugin/displayImageFromRef - parameters:
pageRef: 28:22072FBCA0A8889D9C041D76A588BCF4DCB40376A23B5FD5C301378C8E66EB9F4933A5DFCA46365F927D9E91B337B6E1E980FB4406644801
type: TIFF
im == null!. Stacktrace follows:
Message: im == null!
Line | Method
->> 1457 | write in javax.imageio.ImageIO
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1571 | write in ''
| 28 | writeImageToResponse in edu.missouristate.bdmplugin.ImageService
| 44 | bytesToPng in ''
| 39 | displayImageFromRef in edu.missouristate.bdmplugin.BDMPluginController
| 895 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
| 918 | run . . . . . . . . in ''
^ 680 | run in java.lang.Thread
我尝试了以下脚本来确定安装了哪些图像阅读器:
IIORegistry reg = IIORegistry.getDefaultInstance();
Iterator spIt = reg.getServiceProviders(ImageReaderSpi.class, false);
spIt.each(){
println it.getVendorName() << " | " << it.getVersion() << " | "<< it.getDescription() ;
}
这将输出以下内容:
Sun Microsystems, Inc. | 1.0 | Standard BMP Image Reader
Sun Microsystems, Inc. | 1.0 | Standard GIF image reader
Sun Microsystems, Inc. | 1.0 | Standard WBMP Image Reader
Sun Microsystems, Inc. | 1.0 | Standard PNG image reader
Sun Microsystems, Inc. | 0.5 | Standard JPEG Image Reader
但是,如果我在 Groovy 控制台中运行相同的 Groovy 脚本,我会得到以下输出:
Sun Microsystems, Inc. | 0.5 | Standard JPEG Image Reader
Sun Microsystems, Inc. | 1.0 | Standard BMP Image Reader
Sun Microsystems, Inc. | 1.0 | Standard WBMP Image Reader
Sun Microsystems, Inc. | 1.0 | Standard PNG image reader
Sun Microsystems, Inc. | 1.0 | Standard GIF image reader
Apple computer Inc. | 1.0 | Standard TIFF image reader
相同的阅读器集,但还包括 Apple 的 TIFF 阅读器。为什么 GroovyConsole 能够找到它而不是我的 Grails 环境,即使它们都使用相同的 JRE?有没有一种方法可以通过导入com.sun.media.jai
或导入来手动添加 TIFF 阅读器com.sun.media.imageio.plugins.tiff
?
我尝试将 TIFFImageReaderSpi 的手动注册添加到我的服务方法中:
import com.sun.imageio.plugins.tiff.TIFFImageReaderSpi
...
IIORegistry reg = IIORegistry.getDefaultInstance()
reg.registerServiceProvider(new TIFFImageReaderSpi())
originalImage 变量仍然返回 null。