2012-05-07 7 views
-1

以下のコード。 32ビットマシンではうまくいきましたが、64ビットマシンでは動作しません。64ビットBITマシンで8ビットbmpイメージを保存するには? 32ビットマシンでもうまくいきます。

どのようなアイデア/提案 - これを修正する方法は? uは人をどう思いますか -

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); 
} 
+3

あなたはそれを自分で修正していますか?私にとってはかなり簡単です(ただし、誰かがあなたのために必要とするすべての情報は含まれていませんが)。 – bames53

+0

intのサイズが異なります。おそらくint32のような型を使いたいと思うでしょう。 –

+0

longは、64ビットの実行可能ファイルをコンパイルするときは64ビット、32ビットの実行可能ファイルをコンパイルするときは32ビットとなるでしょう。両方の場合にsizeof(long)が何であるかを見てください。 –

答えて

1

64 MACHINEにIMAGE 8 BIT BMPを保存編集: 私は窓を見て、再びヘッダー、私は、#pragmaパックを逃しました。整列は問題ではありません。

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

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; 
+0

私もそれを試みましたが、私はそれを見つけることができませんでした。あなたは私のコードでどこに示唆していただけますか?この中で私を助けてください........ – Pixel

関連する問題