2012-11-20 116 views
1

我有一個使用jpeg壓縮的多頁tiff。libtiff.net無法讀取jpeg壓縮文件

當經由libtiff.net打開文件我得到以下錯誤消息:

JPEGPreDecode: 
JPEG strip/tile size exceeds expected dimensions, expected 1164x1, got 1164x826. 

所述的圖像處理失敗。 文件/目錄下有此標籤:

OldSubFileType (1 Short): 1 
ImageWidth (1 Long): 1164 
ImageLength (1 Long): 826 
BitsPerSample (3 Short): 8, 8, 8 
Compression (1 Short): JPEG Technote #2 
Photometric (1 Short): YCbCr 
FillOrder (1 Short): Msb2Lsb 
StripOffsets (1 Long): 224 
SamplesPerPixel (1 Short): 3 
StripByteCounts (1 Long): 109294 
XResolution (1 Rational): 200 
YResolution (1 Rational): 200 
PlanarConfig (1 Short): Contig 

與其他JPEG壓縮的文件我沒有問題。 任何想法,爲什麼我得到錯誤?爲什麼期望1164x1?

+0

您是否嘗試使用其他實用程序或庫打開/轉換文件?他們成功了嗎?你能分享這個文件嗎? – Bobrovsky

回答

0

請確保您的文件有ROWSPERSTRIP標記集。

如果沒有這個標籤集,JPEG解碼器可能會認爲圖像中條帶的高度不正確。

其他選項是下載source code of LibTiff.Net,在JpgeCodec.cs的JPEGPreDecode方法開始處設置斷點並查看出了什麼問題。最可能的是,該方法的以下部分導致了警告和編解碼器的行爲不端:

if (segment_height > td.td_rowsperstrip) 
    segment_height = td.td_rowsperstrip; 

你可能會改變該方法的這一部分,但它可能是更好的修復文件,而不是。

您也可以嘗試添加標籤(請注意,您需要爲每個目錄設置標籤)。打開圖像,檢查標籤是否存在,並嘗試使用「SetField」方法爲標籤設置正確的值。

using (Tiff image = Tiff.Open(existingTiffName, "a")) 
{ 
    for (int i = 0; i < image.NumberOfDirectories(); i++) 
    { 
     image.SetDirectory(i); 
     ... 

     FieldValue[] value = image.GetField(TiffTag.ROWSPERSTRIP); 
     if (value == null) 
     { 
      // ROWSPERSTRIP is not set 
      image.SetField(TiffTag.ROWSPERSTRIP, heightOfTheImage); 
     } 
     ... 
    } 
} 

請注意,您應該追加開放更多的圖像(使用"a"參數此)。

+0

我會問這些文件的創建者是否可以添加標籤。 非常感謝您的幫助。 – sqltobi

+0

@sqltobi請參閱答案的更新(我已經添加了替代方法)。 – Bobrovsky