我正在尝试创建一个Grails应用程序,它可以显示TIFF文件和其他图像的预览。如何将TIFF ImageReader添加到在Grails中注册的人
背景
图像是从一个SOAP服务构造的,该服务给了我图像的字节。在服务方法中,我使用byte [],从中构建一个ByteArrayInputStream,然后从中创建一个BufferedImage。
def inputStream = new ByteArrayInputStream(bytes)
BufferedImage originalImage = ImageIO.read(inputStream)
ImageIO.write(originalImage, 'png', response.outputStream)
对于JPG,我可以很容易地将图像作为img标签的src流式传输到浏览器。 TIFFs,但是,我需要将图像转换为其他格式(最好是JPG或PNG),以使它们成为标签的src。
的问题
我知道I need JAI in order to read the TIFF files。 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
我尝试以下script找出安装了哪些图像阅读器:
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
同一套阅读器,但它也包括苹果的TIFF阅读器。为什么GroovyConsole能够找到它而不是我的Grails环境,即使它们都使用相同的JRE?有没有一种方法可以通过从导入com.sun.media.jai
或com.sun.media.imageio.plugins.tiff
进口的某些导入手动添加TIFF阅读器?
我尝试添加了TIFFImageReaderSpi的手工登记到我的服务方法:
import com.sun.imageio.plugins.tiff.TIFFImageReaderSpi
...
IIORegistry reg = IIORegistry.getDefaultInstance()
reg.registerServiceProvider(new TIFFImageReaderSpi())
的originalImage变量仍然回来空。
我有理由确定(至少部分)问题是我需要注册一个可以处理TIFF文件的ImageWriter。然而,在我的JAI课程中似乎没有这样的课程。在寻找它的时候,JAI似乎已经有点像图书馆一样不存在了。如果有人在Grails中取得成功,我可以选择将TIFF转换为更友好的图像。 – jonnybot
+1格式良好的问题。 – dmahapatro
@jonnybot ImageIO使用服务查找机制。通常不需要手动注册'Spi's,只需将相应的JAR放在classpath上即可。此外,您不需要支持TIFF的ImageWriter,因为您只需编写JPEG和PNG。 – haraldK