0

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
4

1 に答える 1