2017-06-07 7 views
-2

bmp画像の高さと幅を取得しようとしていますが、値が正しくないため画像の実際のサイズではありません。ここ
はそうするために私のコードです:C bmpヘッダーに間違った情報が含まれています

#include <stdio.h> 
#include <stdlib.h> 

void main() { 
FILE * Pic; 
errno_t err; 
int **PixelStrength; 
int PictureWidth, PictureHeight; 


err = fopen_s(&Pic, "d2.bmp", "r"); 
if (!err) 
{ 

    fseek(Pic, 18, SEEK_SET); 
    PictureWidth = fgetc(Pic); 
    fseek(Pic, 22, SEEK_SET); 
    PictureHeight = fgetc(Pic); 
} 


if (Pic) 
{ 
    err = fclose(Pic); 
} 
} 

私は、これは任意の大きい方のためにしかし、小さな絵のためではない働いていることに注意してください。私が試した画像は640 x 480ですが、私が受け取る値は128 x 224です。ご協力いただきありがとうございます。

+1

640 = 2 * 256 + 128; 480 = 256 + 224 – pmg

+0

ヘッダー 'struct'を定義し、関数を使って正しいエンディアン形式でメンバーを抽出するか、バイト配列とすることをお勧めします。 –

+1

もう一つの問題: 'fopen_s(&Pic、" d2.bmp "、" r ");' - > 'fopen_s(&Pic、" d2.bmp "、" rb ");' b'を追加する。バイナリモードでファイルを開きます。 – chux

答えて

1

fgetc()は、ファイルから1バイトをフェッチします。高さと幅の値は、32ビットのリトルエンディアンとして格納されます。 640は0x280、480は0x1E0なので、取得する値は0x80(128)と0xE0(224)です。値の下位バイトだけです。

PictureWidth = fgetc(Pic); 
PictureWidth += 256 * fgetc(Pic); 

(はい、彼らは本当に4バイトである32ビット値、ですが、それはあなたがいつでもすぐに70000ピクセル幅のBPMに実行されます可能性は低い)のようなものを試してみてください。

+0

左から右に実行されている 'fgetc()'呼び出しに依存することはできません。それらを別々のステートメントとして実行します。 – Barmar

+0

良い点、ありがとうございます。 –

関連する問題