Я пытаюсь создать приложение Grails, которое может отображать превью файлов TIFF и других изображений.Как добавить TIFF ImageReader к зарегистрированным в Grails
фон
Изображения построены из службы SOAP, который дает мне байты изображения. В методе службы я беру байт [], создаю из него ByteArrayInputStream, а затем создаю BufferedImage.
def inputStream = new ByteArrayInputStream(bytes)
BufferedImage originalImage = ImageIO.read(inputStream)
ImageIO.write(originalImage, 'png', response.outputStream)
Для JPG я могу легко передавать изображения в браузер таким образом, как src тега img. TIFF, однако, мне нужно будет преобразовать изображения в другой формат (желательно JPG или PNG), чтобы сделать их src тега.
Проблема
Я знаю, что I need JAI in order to read the TIFF files. Файлы jai_core.jar, jai_codec.jar находятся в моем пути к классам. Фактически, поскольку я на Mac OSX, они устанавливаются автоматически. Тем не менее, когда я запустить приложение Grails и пытается построить TIFF изображение из полученных байт от службы SOAP, я получаю эту ошибку:
| 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 консоли, я получаю эту OUTP ut:
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 от Apple. Почему GroovyConsole может найти его, а не мою среду Grails, хотя они оба используют одну и ту же JRE? Есть ли способ, который я могу вручную добавить читателя TIFF через некоторый импорт из импорта com.sun.media.jai
или com.sun.media.imageio.plugins.tiff
?
Я пытался добавить вручную регистрации TIFFImageReaderSpi моему методу обслуживания:
import com.sun.imageio.plugins.tiff.TIFFImageReaderSpi
...
IIORegistry reg = IIORegistry.getDefaultInstance()
reg.registerServiceProvider(new TIFFImageReaderSpi())
Переменная originalImage еще возвращается нуль.
Я достаточно убедитесь, что (по крайней мере, частично) проблема в том, что мне нужно зарегистрировать ImageWriter, который также может обрабатывать файлы TIFF. Однако, похоже, для классов JAI у меня нет класса. При поиске вокруг это похоже на то, что JAI несколько не функционирует как библиотека. Я открыт для альтернатив для преобразования TIFF в более удобные для веб-изображений изображения, если кто-то имел успех с тем, что было в Grails. – jonnybot
+1 для хорошо отформатированного вопроса. – dmahapatro
@jonnybot ImageIO использует механизм поиска службы. Обычно нет необходимости вручную регистрировать 'Spi', просто поместите соответствующие JAR-файлы в classpath. Кроме того, вам не нужен ImageWriter, поддерживающий TIFF, поскольку вы просто хотите писать JPEG и PNG. – haraldK