質問

小さなCプログラムを使用して16ビットのグレースケールTIFFファイル(BitsPerSample = 16)を読み取って、さらに分析するために浮動小数点数の配列に変換しようとしています。ヘッダーデータによると、ピクセルデータは2048x2048ピクセルの単一ストリップです。エンコードはリトルエンディアンです。
そのヘッダー情報を使用して、2048x2048x2バイトの単一ブロックを読み取り、それを2048x2048 2バイト整数として解釈できると期待していました。実際に私が得るのは、1024x1024の 4つの象限に分割した写真です各ピクセル、下の2つにはゼロのみが含まれます。上位2つの象限はそれぞれ、全体像が見えると思ったように見えます。 alt text http://users.aber.ac.uk/ruw/unlinked/15_inRT_0p457.png
同じファイルをGimp またはImagemagickに読み込むと、どちらも教えてくれます彼らは8ビットに減らす必要があります(これは私には役立ちません-私は全範囲が必要です)が、ピクセルは正しい場所に現れます:代替テキスト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 <!> lt; 2048 <!> gt;
ImageLength(257)LONG(4)1 <!> lt; 2048 <!> gt;
BitsPerSample(258)SHORT(3)1 <!> lt; 16 <!> gt;
圧縮(259)短(3)1 <!> lt; 1 <!> gt;
フォトメトリック(262)ショート(3)1 <!> lt; 1 <!> gt;
StripOffsets(273)LONG(4)1 <!> lt; 4096 <!> gt;
オリエンテーション(274)ショート(3)1 <!> lt; 1 <!> gt;
RowsPerStrip(278)LONG(4)1 <!> lt; 2048 <!> gt;
StripByteCounts(279)LONG(4)1 <!> lt; 8388608 <!> gt;
XResolution(282)RATIONAL(5)1 <!> lt; 126.582 <!> gt;
YResolution(283)RATIONAL(5)1 <!> lt; 126.582 <!> gt;
ResolutionUnit(296)SHORT(3)1 <!> lt; 3 <!> gt;
34710(0x8796)LONG(4)1 <!> lt; 0 <!> gt;
(タグ34710はカメラ情報です。これが何らかの形で違いを生じないようにするために、画像ファイルディレクトリの終わりからデータの開始までの範囲全体を0x1000でゼロにしましたが、実際にはそうしません違いがあります。)

役に立ちましたか?

解決

問題が見つかった-それは私の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;
}

他のヒント

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

プラットフォームは何ですか?あなたは何をしようとしているのですか? Windows上の.NETで作業する場合は、画像処理ツールキットを販売していますには、TIFFコーデックが含まれています。TIFFコーデックは、投げることができるほとんどすべてで動作し、16 bppの画像を返します。また、16bpp画像でネイティブに動作する多くのツールがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top