请问一下,你做的将32位转成24位位图的程序
下面的代码实现从32位向24位转换:widthbytes1=w*4;
widtybytes2=(w*24+31)/32*4;//double word alignedunsigned long* raster = (unsigned long*)GlobalAlloc(GMEM_FIXED, (w * h * sizeof (uint32)));
HGLOBAL TempBuff = GlobalAlloc(GHND,(h*widtybytes2));char* pOutBuf = (char*)TempBuff;
char* pData = (char*)raster;if(bitcount==32){
for(i=0; i<h; i++){
                  
int m1=i*widthbytes1;
int m2=i*widthbytes2;
for(j=0; j<w; j++){
int offset1=m1+j*4;
int offset2=m2+j*3;
pOutBuf[offset2+0]=pData[offset1+0];//blue
pOutBuf[offset2+1]=pData[offset1+1];//green
pOutBuf[offset2+2]=pData[offset1+2];//red
}
}
}
其中pData和pOutBuf是char*型的指针对么?我这样做这么总是在i=2,j=243时,
pOutBuf[offfset2+1]=pData[offset1+1];//green
这一行溢出啊?请问应该注意什么地方啊?

解决方案 »

  1.   

    不是呢,你跟踪一下就知道.比如一点象速,32BIT,应该是四个字节表示.那么转为24BIT的时候,把每四个字节的第二字节扔掉就可以了,你试下就知道.
      

  2.   

    FILE *fp1;
    BITMAPFILEHEADER sbf;
    PBYTE pImgData;
    DWORD SrcImgSize; if((fp1=fopen(SrcFileName,"rb"))==NULL)
    {
    MessageBox(NULL,"File cann't open","error",MB_OK);
    return false;
    }
    fread(&sbf,1,14,fp1);
    SrcImgSize=sbf.bfSize-14;
    pImgData=new BYTE[SrcImgSize];
    fread(pImgData,1,SrcImgSize,fp1);
    fclose(fp1); LPBITMAPINFOHEADER lpbi=(LPBITMAPINFOHEADER)pImgData;
    if(lpbi->biBitCount==32)//如果是32位则转为24位
    {
    lpbi->biBitCount=24;
    lpbi->biCompression=0;
    lpbi->biSizeImage=lpbi->biWidth*lpbi->biHeight*3;
    SrcImgSize=lpbi->biSizeImage+40;
    PBYTE ptr1,ptr2;
    ptr1=ptr2=pImgData+40;
    for(int i=0;i<lpbi->biWidth*lpbi->biHeight;i++)
    {
    *ptr1++=*(ptr2);
    *ptr1++=*(ptr2+1);
    *ptr1++=*(ptr2+2);
    ptr2+=4;
    }
    } if((fp1=fopen(DstFileName,"wb"))==NULL)
    {
    MessageBox(NULL,"File cann't open","error",MB_OK);
    return false;
    }
    fwrite(&sbf,1,14,fp1);
    fwrite(pImgData,1,SrcImgSize,fp1);
    fclose(fp1); delete[] pImgData;
    return true;