0

小さな C プログラムを使用して 16 ビット グレースケール TIFF ファイル (BitsPerSample=16) を読み込んで、さらに分析するために浮動小数点数の配列に変換しようとしています。ピクセル データは、ヘッダー情報によると、2048x2048 ピクセルの 1 つのストリップにあります。エンコーディングはリトルエンディアンです。
そのヘッダー情報を使用して、2048x2048x2 バイトの単一ブロックを読み取り、それを 2048x2048 の 2 バイト整数として解釈できると期待していました。私が実際に得たのは、それぞれ 1024x1024 ピクセルの4 つの象限に分割された画像で、下の 2 つにはゼロしか含まれていません。上部の 2 つの象限はそれぞれ、全体像が見えると予想していたように見えます: alt テキスト http://users.aber.ac.uk/ruw/unlinked/15_inRT_0p457.png同じファイルを Gimp
に読み込むとまたはImagemagick、どちらも8ビットに減らす必要があると教えてくれますが(これは役に立ちません-フルレンジが必要です)、ピクセルは適切な場所に表示されます:alt text http://users.aber. ac.uk/ruw/unlinked/15_inRT_0p457_gimp.png これは、データが 1 つのストリップ内でどのように配置されているかについての私の考えが間違っていることを示唆しています。一方、ファイルはヘッダー情報に関して正しくフォーマットされている必要があります。そうしないと、Gimp が正しく取得できません。どこが間違っていますか?

tiffdump からの出力:
15_inRT_0p457.tiff:
マジック: 0x4949 バージョン: 0x2a
ディレクトリ 0: オフセット 8 (0x8) 次の 0 (0)
ImageWidth (256) LONG (4) 1<2048>
ImageLength (257) LONG (4) 1<2048 >
BitsPerSample (258) SHORT (3) 1<16>
Compression (259) SHORT (3) 1<1>
Photometric (262) SHORT (3) 1<1>
StripOffsets (273) LONG (4) 1<4096>
Orientation (274) SHORT (3) 1<1>
RowsPerStrip (278) LONG (4) 1<2048>
StripByteCounts (279) LONG (4) 1<8388608>
XResolution (282) RATIONAL (5) 1<126.582>
YResolution (283 ) RATIONAL (5) 1<126.582>
ResolutionUnit (296) SHORT (3) 1<3>
34710 (0x8796) LONG (4) 1<0>
(タグ 34710 はカメラ情報です。これがなんらかの違いを生じないようにするために、画像ファイル ディレクトリの末尾から 0x1000 のデータの先頭までの範囲全体をゼロにしましたが、実際にはそうではありません。違います。)

4

2 に答える 2

1

私は問題を見つけました-それは私のCプログラムにありました...

longの配列にメモリを割り当て、fread()を使用してデータを読み込みました。

#define PPR 2048;
#define BPP 2;
long *pix;
pix=malloc(PPR*PPR*sizeof(long));
fread(pix,BPP,PPR*PPR,in);

ただし、データは2バイトのチャンク(BPP = 2)であり、sizeof(long)= 4であるため、fread()は、データを長いサイズのパーセルにパックするのではなく、割り当てられたメモリ内に密にパックします。したがって、2つの行が1つにまとめられ、画像の後半が空になります。

ピクセル数をループし、毎回2バイトを読み取り、代わりに割り当てられたメモリに格納するように変更しました。

for (m=0;m<PPR*PPR;m++) {
  b1=fgetc(in);
  b2=fgetc(in);
  *(pix+m)=256*b1+b2;
}
于 2009-01-09T18:25:28.407 に答える
0

StripOffsets が配列である場合、それはオフセットの配列へのオフセットであることを理解していますよね? その逆参照を適切に行っていない可能性があります。

あなたのプラットフォームは何ですか?あなたは何をしようとしているのですか?Windows で .NET を使用する場合は、TIFF コーデックを含む画像処理ツールキットを会社から販売しています。TIFF コーデックは、ほとんどすべての処理に対応し、16 bpp の画像を返します。また、16bpp イメージでネイティブに動作するツールも多数あります。

于 2009-01-09T14:38:45.167 に答える