2012-11-20 78 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