2017-12-16 14 views
1

ビットマップファイルを変更しようとしていますが、そのためにサイズが必要です。ビットマップファイルのサイズは正しいですか?一致するプロパティがありません

私は(Cを使用して、ところで)これらの構造体を使用し、私は適切にヘッダを読んでかなり確信している:

#pragma pack(1) 

struct bmp_fileheader 
{ 
    unsigned char fileMarker1; /* 'B' */ 
    unsigned char fileMarker2; /* 'M' */ 
    unsigned int bfSize; /* File's size */ 
    unsigned short unused1; 
    unsigned short unused2; 
    unsigned int imageDataOffset; /* Offset to the start of image data */ 
}; 

struct bmp_infoheader 
{ 
    unsigned int biSize; /* Size of the info header - 40 bytes */ 
    signed int  width; /* Width of the image */ 
    signed int  height; /* Height of the image */ 
    unsigned short planes; 
    unsigned short bitPix; 
    unsigned int biCompression; 
    unsigned int biSizeImage; /* Size of the image data */ 
    int   biXPelsPerMeter; 
    int   biYPelsPerMeter; 
    unsigned int biClrUsed; 
    unsigned int biClrImportant; 
}; 

#pragma pack() 

私はバギー結果を取得しています、と私はそれがあるためだと思う一日の終わりにbfSizeはファイルのプロパティと一致しません。 (右クリックプロパティはprintf関数のbfSizeとは異なります。

を私は、このリンク(https://en.wikipedia.org/wiki/BMP_file_format#Example_1)から理解して何から、bfSizeは、パディングを含めた全体のサイズを、含まれている必要があります。

bfSizeは性質が異なる場合、それは大丈夫ですか?私はアイデアを得た

、私は、プラグマパックを使用して構造体を読んでいるので、私はピクセルの配列は?

を開始どこから読んでいるかのように私のバギー結果は、その後、私は、ファイルから読み続けていることだと思います

私は

のようなものを使用しています
FILE *pf 

これらの構造体を読みました。

ピクセルの配列内に格納されているオクテットの数を計算します。

次に、pfの位置から続くオクテットを読んでいます。これは、私のロジックによれば、配列がどこから始まるのかがわかります。

読んでいただきありがとうございます。

編集:ps:これらの違いは次のとおりです:bfSizeは 3645と表示され、プロパティにはかなり大きな違いが3702と表示されます。 bfSizeの数値は、プロパティの数値よりも常に小さくなります。

+0

'bfSize'がDisk_バイトの_Sizeより小さい場合、' bfSize'は間違っています。 MSDNから: 'bfSize' _ビットマップfile_のサイズをバイト単位で指定します。 –

+0

ファイルをモード "" rb "'で開きますか? –

+0

私はそれを "rb"モードで開きます。同じFILE * pfを使って2つの構造体を読んでいます。それから私は各バイトを読みます。 – NuSuntStudent

答えて

1

bfSizeは、ヘッダーを含むファイルのサイズです。

biSizeImageは、バイト単位のピクセルデータのサイズです。データはimageDataOffset(より一般的にはbfOffBitsと呼ばれます)で開始します。

#pragma pack(1)でヘッダーを定義するのは正しいです。それらを定義した後は、パッキングを復元する必要がありますが、読み込みには問題はありません。

画像のサイズを変更したい場合は、新しい高さに新しいスキャンラインのサイズを掛け算する必要があります。走査線を使用して、最も近い単語に切り上げられます。ファイルからビットマップ情報ヘッダー構造体の読み取りbih

int scanlineSize= WIDTHBYTES(bih.biWidth * bih.biBitCount); 

:あなたは次のように呼び出す

// WIDTHBYTES takes # of bits in a scanline and rounds up to nearest word. 
#define WIDTHBYTES(bits) (((bits) + 31)/32 * 4) 

ビットマップの読み取り方法については、pointer file randomly changes value in middle of reading raw bitmap dataも参照してください。

+1

私はファイルのサイズを変更したくありません。見て、私は数字と白い背景との写真を取得しています。数字は色が異なり、ランダムに配置されます。私の目標は、数字の色を特定の色に変更することです。これをすべての桁に適用し、新しいbmpファイルを生成します。私の問題は、これまでのところ、私のbfSizeが間違っていることが原因であると思われます。なぜ私はその理由を理解できません。 – NuSuntStudent

関連する問題