2017-06-19 70 views
0

我想顯示一些存儲在oracle數據庫BLOB中的tiff。我只是嘗試使用im4java將它們從tiff轉換爲jpg或png,但那不起作用。也許有可能在Jasper中顯示.tiff和其他img數據類型而不轉換它們!或者如果沒有,是否有人有詳細的解決方案如何轉換它們? (我需要配置哪些圖片類,如何在scriptlet中實現)JasperReports - 在db中顯示存儲在BLOB中的tiff

謝謝大家!

 IMOperation op = new IMOperation(); 
     op.addImage(); 
     op.addImage(); 

     ConvertCmd convert = new ConvertCmd(); 
     convert.run(op, new Object[]{inputImage.getAbsolutePath(), outputImage.getAbsolutePath()}); 
    return outputImage;` 
+0

它以什麼方式不起作用?轉換失敗了嗎?你無法顯示轉換後的文件嗎?你有沒有得到任何例外或錯誤信息? – haraldK

+0

@haraldK'net.sf.jasperreports.engine.JRException:無法添加單元格。在com.jaspersoft.studio.editor.preview.actions.export.AExportA ction $ 3.run(AExportA ction.java:188)at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55 )引起:net.sf.jasperreports.engine.JRException:圖像讀取失敗。這是錯誤消息的一部分,所以我認爲轉換失敗。我不知道如何在scriptlet中正確實現代碼,因此轉換在每個細節帶之前執行。另一個問題是,並非所有圖像都是tiff,但也包括jpg和一些更老的img類型。 –

回答

0

問題解決了,這裏的代碼中使用回力imageIO.jar爲TIFF轉換成JPG工作對我來說:

進口java.awt.image.BufferedImage中; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream;

import javax.imageio.ImageIO; import javax.imageio.spi.IIORegistry;

import net.sf.jasperreports.engine.JRAbstractScriptlet; import net.sf.jasperreports.engine.JRScriptletException;

public static InputStream convertTifToPng(InputStream inputImage) 
     throws IOException, InterruptedException { 
    IIORegistry registry = IIORegistry.getDefaultInstance(); 
    registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.tiff.TIFFImageWriterSpi()); 
    registry.registerServiceProvider(new com.sun.media.imageioimpl.plugins.tiff.TIFFImageReaderSpi()); 

    BufferedImage image; 

    if (inputImage != null) { 
     image = ImageIO.read(inputImage); 
    } else { 
     return null; 
    } 

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ImageIO.write(image, "jpg", baos); 
    InputStream outputImage = new ByteArrayInputStream(baos.toByteArray()); 

    return outputImage; 
}