2017-03-01 76 views
0

我試圖設計一個報告模板,其中有許多(數百個)圖像被超鏈接引用。我想該文件是25MB下(電子郵件等原因),所以我試圖壓縮使用下面的代碼的圖像:apache POI XWPF文件中的圖像顏色失真

//I get the input stream 
InputStream ins = entity.images.getInputStream(img); 
BufferedImage bufImg = ImageIO.read(ins); 

//I compress the image 
ByteArrayOutputStream compressed = new ByteArrayOutputStream(); 
ImageOutputStream outputStream = ImageIO.createImageOutputStream(compressed); 
ImageWriter jpgWriter = ImageIO.getImageWritersByFormatName("jpg").next(); 
ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam(); 
jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
jpgWriteParam.setCompressionQuality(0.98f); 
jpgWriter.setOutput(outputStream); 
jpgWriter.write(null, new IIOImage(bufImg, null, null), jpgWriteParam); 
jpgWriter.dispose(); 
byte[] jpegData = compressed.toByteArray(); 

//I attempt to add the compressed image 
imgRun.addPicture(new ByteArrayInputStream(jpegData), Document.PICTURE_TYPE_JPEG,"text", Units.toEMU(newWidth), Units.toEMU(newHeight)); 

的圖像寫入文件,但它們的顏色失真。在我的情況下,他們都是紅/橙色。任何想法是什麼造成這/做什麼?

+1

我沒有答案,但它看起來像你使用JPG的文件,然後將其添加爲PNG。代碼是否正確? – stdunbar

+0

我修復了帖子,應該說是PICTURE_TYPE_JPEG。但問題依然存在。有任何想法嗎? –

+0

將圖像放入文檔之前圖像是否正確? – stdunbar

回答

0

它看起來像問題是一些圖像是.gifs。

無論如何,我通過在壓縮之前首先將所有圖像轉換爲.jpg來解決該問題。見下:

BufferedImage newBufferedImage = new BufferedImage(bufImg.getWidth(), 
      bufImg.getHeight(), BufferedImage.TYPE_INT_RGB); 
newBufferedImage.createGraphics().drawImage(bufImg, 0, 0, Color.WHITE, null); 
相關問題