C++ の方法でビットマップ ファイルを読み込もうとしています。このファイルには 2 つのヘッダー (ファイル ヘッダーとイメージ ヘッダー) があります。私はそれらの両方を読むことに成功しました。しかし今、ヘッダーを赤くするのと同じ方法でデータを読み込もうとしていますが、失敗します。C の方法を使用してバイナリ ファイルを読み取ると、すべて問題ありません。コードは次のとおりです: im_bmp.cpp
#include <iostream>
#include <fstream>
#include "im_bmp.h"
using namespace std;
void read_bmp(const char* f)
{
pict I; unsigned char pix[3]; px pxl; int i = 0;
FILE* fl = fopen(f, "rb");
fread(&I, sizeof(pict), 1, fl);
printf("%d\n%d\n",I.im.bpp,I.fhd.f_off); // A test to show the bit per pixel and the offset(where image data begin)
while(i<2)
{
fread(&pix,1,3,fl);
printf("%d %d %d ",pix[2],pix[1],pix[0]); // A test to show the first two pixels
i++;
}
// The code below read binary files in the C++ way
/*
ifstream ifs;
ifs.open(f,ios::binary);
ifs.read((char *)&I,sizeof(pict));
cout << I.im.bpp << endl; // It works here. It's headers
ifs.read((char *)&pxl,sizeof(pxl));
cout << pxl.r << endl; // It fails here to read the first pixel
*/
fclose(fl);
}
im_bmp.h
#ifndef IM_BMP_H_INCLUDED
#define IM_BMP_H_INCLUDED
#include <iostream>
#include <fstream>
#pragma pack(1)
using namespace std;
/*
typedef int int32;
typedef short int16;
typedef struct px
{
unsigned char r, g, b;
} px;
typedef struct pict
{
int w, h;
px dt;
} pict;
struct im_hd
{
int32 hd_sz;
int32 wdt;
int32 hgt;
int16 im_pl;
int16 bpp;
int32 cmp;
int32 im_sz;
int32 hr;
int32 vr;
int32 clr;
int32 mclr;
};
struct fl_hd
{
char hd[2];
int32 sz;
int32 rsv;
int32 f_off;
im_hd im;
};
*/
struct im_hd
{
int hd_sz;
int wdt;
int hgt;
short im_pl;
short bpp;
int cmp;
int im_sz;
int hr;
int vr;
int clr;
int mclr;
};
struct fl_hd
{
char hd[2];
int sz;
int rsv;
int f_off;
//im_hd im;
};
typedef struct px
{
unsigned char r, g, b;
} px;
typedef struct pict
{
fl_hd fhd;
im_hd im;
//int w, h;
//px* dt;
} pict;
void read_bmp(const char* f);
#endif // IM_BMP_H_INCLUDED
C++ でこれを実行しようとしましたが、うまくいきません:
ifstream ifs;
ifs.open(f,ios::binary);
ifs.read((char *)&I,sizeof(pict));
cout << I.im.bpp << endl; // It works here. It's headers
ifs.read((char *)&pxl,sizeof(pxl));
cout << pxl.r << endl; // It fails here to read the first pixel