-1

以下のコード。32ビットマシンではうまくいきましたが、64ビットマシンではうまくいきません..

アイデア/提案 - そしてこれを修正する方法??? 皆さんはどう思いますか - 64 MACHINE で画像 8 ビット BMP を保存

void BMPFile::SaveBMP(char* fileName,BYTE * buf,UINT width,UINT height)
{
    short res1=0;
    short res2=0;
    long pixoff=54;
    long compression=0;
    long cmpsize=0;
    long colors=0;
    long impcol=0;
    char m1='B';
    char m2='M';

    DWORD widthDW = WIDTHBYTES(width *24);

    long bmfsize=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
                            widthDW * height;   
    long byteswritten=0;

    BITMAPINFOHEADER header;
    header.biSize=40;                       // header size
    header.biWidth=width;
    header.biHeight=height;
    header.biPlanes=1;
    header.biBitCount=24;                   // RGB encoded, 24 bit
    header.biCompression=BI_RGB;            // no compression
    header.biSizeImage=0;
    header.biXPelsPerMeter=0;
    header.biYPelsPerMeter=0;
    header.biClrUsed=0;
    header.biClrImportant=0;

    FILE *fp;   
    fp=fopen(fileName,"wb");
    if (fp==NULL)
    {
        return;
    }

    // should probably check for write errors here...

    fwrite((BYTE  *)&(m1),1,1,fp); byteswritten+=1;
    fwrite((BYTE  *)&(m2),1,1,fp); byteswritten+=1;
    fwrite((long  *)&(bmfsize),4,1,fp); byteswritten+=4;
    fwrite((int  *)&(res1),2,1,fp); byteswritten+=2;
    fwrite((int  *)&(res2),2,1,fp); byteswritten+=2;
    fwrite((long  *)&(pixoff),4,1,fp); byteswritten+=4;

    fwrite((BITMAPINFOHEADER *)&header,sizeof(BITMAPINFOHEADER),1,fp);
    byteswritten+=sizeof(BITMAPINFOHEADER);

    long row=0;
    long rowidx;
    long row_size;
    row_size=header.biWidth*3;
    long rc;
    for (row=0;row<header.biHeight;row++) 
    {
        rowidx=(long unsigned)row*row_size;                           

        // write a row
        rc=fwrite((void  *)(buf+rowidx),row_size,1,fp);
        if (rc!=1) 
        {
            break;
        }
        byteswritten+=row_size; 

        // pad to DWORD
        for (DWORD count=row_size;count<widthDW;count++) {
            char dummy=0;
            fwrite(&dummy,1,1,fp);
            byteswritten++;                           
        }
    }             
    fclose(fp);
}
4

1 に答える 1

1

編集: Windows ヘッダーをもう一度見たところ、#pragma pack がありませんでした。したがって、アライメントは問題ではありません。

通常、固定サイズの値をディスクに書き込む必要がある場合は、明示的にサイズ設定されたデータ型を使用します。これは、int/long などのサイズがコンパイラとアーキテクチャ間で異なる可能性があるためです。ANSI プラットフォームでは、「stdint.h」をインクルードします。Visual C では、これらを typedef できます。

typedef signed __int8 int8_t;
typedef signed __int16 int16_t;
typedef signed __int32 int32_t;
typedef signed __int64 int64_t;
typedef unsigned __int8 uint8_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;
于 2012-05-07T04:38:40.663 に答える