2017-06-27 175 views
0

我的應用程序負責使用特定的alghoritm將單個TIFF文件分割成多個較小的文件。一切正常,但我關心的是,應用程序生成的文件大小超過原始文件。圖像壓縮和ImageIO庫

應用程序處理的原始文件總大小約爲26mb,生成的文件總大小等於387mb!下面是一個過程的代碼片段 - 我是一個圖像壓縮和ImageIO庫的amator,並且一直沒能找到任何有用的東西,因此我想問問是否有什麼我可以改變的那些結果更接近。理想情況下,我想使用與原始相同的壓縮。

final ImageWriter writer = ImageIO.getImageWritersByFormatName(resultsExtension).next(); 

    final ImageWriteParam writeParams = writer.getDefaultWriteParam(); 
    writeParams.setCompressionMode(ImageWriteParam.MODE_COPY_FROM_METADATA); 

    BufferedImage page = ImageUtils.getSinglePageFromTiffFile(documentToSplit, currentPageIndex); 

    while (currentPageIndex < pagesQty) { 

    OutputStream outStream = null; 
    ImageOutputStream imgOutStream = null; 

    try { 
     outStream = new FileOutputStream(newDocFile); 
     imgOutStream = ImageIO.createImageOutputStream(outStream); 

     writer.setOutput(imgOutStream); 
     writer.prepareWriteSequence(null); 

     writer.writeToSequence(new IIOImage(page, null, null), writeParams); 
     currentPageIndex++; 

     if (CONDITION) { 
      writer.endWriteSequence(); 
      break; 
     } 

     writer.writeToSequence(new IIOImage(page, null, null), writeParams); 
     currentPageIndex++; 
     } 

    } finally { 
     if (imgOutStream != null) { 
     imgOutStream.close(); 
     } 
     if (outStream != null) { 
     outStream.close(); 
     } 
    } 
    } 

getSinglePageFromTiffFile方法:

public static BufferedImage getSinglePageFromTiffFile(File file, int pageIndex) 
    throws IOException { 
ImageInputStream is = ImageIO.createImageInputStream(file); 
ImageReader reader; 
try { 
    reader = ImageIO.getImageReaders(is).next(); 
    reader.setInput(is); 
    return reader.read(pageIndex); 
} finally { 
    if (is != null) { 
    is.close(); 
    } 
} 

}

+1

如果您想將多頁TIFF拆分爲多個單頁TIFF,您可能需要查看[this Q/A](https://stackoverflow.com/q/44565928/1428606),其中演示瞭如何執行這不需要解碼圖像,從而保持原始的壓縮/文件大小。 – haraldK

回答

1

讀你的代碼,我解釋如下:

在我看來,你是從你的源圖像讀取到的未壓縮數據結構(BufferedImage)。這個數據結構似乎沒有任何有關數據壓縮的信息。

所以在你的寫作邏輯中,你確實設置了「從輸入圖像複製壓縮」(ImageWriteParam.MODE_COPY_FROM_METADATA)。由於讀取的圖像本身不具有任何壓縮信息,因此圖像數據應以未壓縮格式寫入。

使用壓縮的輸入圖像和未壓縮的輸出圖像,難怪單個圖塊的大小與輸入文件相比更大。雖然這可能是可能的,但輸入圖像在被壓縮的頁面之間也存在冗餘(我不知道TIFF足夠說明這一點),但我認爲它更可能是您正在編寫未壓縮的圖像數據出。

+0

我已經發布了返回'BufferedImage'的方法。如何將有關原始文件壓縮的​​信息傳輸到輸出文件?有沒有辦法做到這一點?我不想降低原始圖像的質量。 –

+0

ImagerReader :: getImageMetadata(int imageIndex)返回一個IIOMetadata。你可能可以在ImageWriter中使用它,但是我不知道該怎麼做。 在您的項目中設置固定壓縮值還是必須使用與輸入文件中相同的值? – Ray