2012-09-23 23 views
0

我調整使用Apache Sanselan這也與CMYK顏色涉及許多JPEG圖像。 我想轉換一個具有alpha通道JPEG圖像時,有一個問題...這樣做的時候,結果是用不同顏色的圖像,我想這莫名其妙的java處理這些類型的圖像爲不同的顏色格式。 正如我所說,RGB調整大小以及CMYK都可以正常工作。 ARGB圖像以不同的顏色顯示。的BufferedImage得到調整大小以不同的顏色

一個例子: Before resizing

After resizing

有什麼建議?我能否以某種方式強制忽略Alpha通道並將圖像作爲RGB圖像處理?或將其轉換爲RGB圖像而不會丟失真實的顏色?

處理這個圖片的代碼是:提前

ImageInputStream stream = ImageIO.createImageInputStream(file); 
    Iterator<ImageReader> iter = ImageIO.getImageReaders(stream); 
    while (iter.hasNext()) { 
     ImageReader reader = iter.next(); 
     reader.setInput(stream); 

     BufferedImage image = null; 
     ICC_Profile profile = null; 
     try { 
      image = reader.read(0); 

     } catch (IIOException e) { 
      ... (CMYK conversion if needed) 
     } 

     return image; 
    } 
    return null; 

感謝

+0

我想提一提的是,顏色多變無關與調整大小,讀入的BufferedImage和寫作使用ImageIO.write(BI,FORMATNAME,的TargetFile)的結果;輸出的[使用ImageIO.write JPG文件問題]不想要的結果 – Eyal

+0

可能重複(http://stackoverflow.com/questions/4386446/problem-using-imageio-write-jpg-file) – Thilo

回答

1

我找到了一個很好的解決方案在這裏(第一個解決方案很好工作):

problem using ImageIO.write jpg file

編輯: 有一個新的開源庫支持CMYK處理。 所有你需要做的是依賴添加到您的項目和新的閱讀器將被添加到讀者名單(當知JPEGImageReader不能用CMYK處理)。 您可能想要遍歷這些閱讀器並使用第一個不會拋出異常的閱讀器閱讀圖像。 這個包是一個候選版本,但我使用它,它解決了我們有很難處理的是一個巨大的問題。

http://mvnrepository.com/artifact/com.twelvemonkeys.imageio/imageio-jpeg/3.0-rc5

你可以做迭代這種方式來獲得數據的BufferedImage,和你有在那之後,剩下的就是容易(你可以使用任何現有的圖像轉換封裝保存爲另一種格式):

try (ImageInputStream input = ImageIO.createImageInputStream(source)) { 

     // Find potential readers 
     Iterator<ImageReader> readers = ImageIO.getImageReaders(input); 

     // For each reader: try to read 
     while (readers != null && readers.hasNext()) { 
      ImageReader reader = readers.next(); 
      try { 
       reader.setInput(input); 
       BufferedImage image = reader.read(0); 
       return image; 
      } catch (IIOException e) { 
       // Try next reader, ignore. 
      } catch (Exception e) { 
       // Unexpected exception. do not continue 
       throw e; 
      } finally { 
       // Close reader resources 
       reader.dispose(); 
      } 
     } 

     // Couldn't resize with any of the readers 
     throw new IIOException("Unable to resize image"); 
    } 
相關問題