1

jpeg 圧縮を使用した複数ページの tiff があります。

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 を期待するのはなぜですか?

4

1 に答える 1

0

ファイルにROWSPERSTRIPタグが設定されていることを確認してください。

このタグが設定されていないと、JPEG デコーダーは、画像内のストリップの高さが正しくないと見なす可能性があります。

他のオプションは、 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"パラメーターを使用します)。

于 2012-11-24T19:12:47.033 に答える