2012-05-07 109 views
-1

下面提到的代碼;在32位機器上運行良好,但在64位機器上工作不正常。如何在64位機器中保存8位bmp圖像?在32位機器上運行得很好

任何想法/建議 - 以及如何解決此問題? 什麼ü認爲球員 - 保存圖像的8位BMP在64 MACHINE

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

編輯: 我看着Windows頭一遍,我錯過了的#pragma包。所以對齊不是問題。

一般來說,如果你需要向磁盤寫入固定大小的值,使用明確大小的數據類型,因爲編譯器和體系結構之間int/long等的大小可能不同。在ANSI平臺上,您可以在visual c上包含「stdint.h」,您可以鍵入以下命令:

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

相關問題