我想请教处理后的位图文件保存后无法打开,
是不是我其中那部分的程序出了问题.
希望高手帮我找找错误.
KillTimer(1);
DWORD ByteSize;
m_bmp.GetBitmap(&bm);   
BYTE* lpBits;           //定义图像数据指针
char unsigned *temp;
int bmBytePixel=bm.bmBitsPixel/8;     //每行图像占的字节数
ByteSize=bm.bmHeight*bm.bmWidthBytes; //整幅图像占的字节数
lpBits=new BYTE[ByteSize];
m_bmp.GetBitmapBits(ByteSize,lpBits);     //现在lpBits里面就是象素的RGB值了
//对其中的R,G,B值依次进行处理
for(int i=0;i<bm.bmHeight;i++)
   {
for(int j=0;j<bm.bmWidth;j++)
{
temp=lpBits;
     if((*temp>10)&&(*(temp++)>50)&&(*(temp++)<80))
  
 {
 *lpBits =255;
             lpBits ++;
             *lpBits = 255;
             lpBits ++;
             *lpBits = 255;
             lpBits ++;
 }
          else
  {
             lpBits=lpBits+3;
  }
}
}//现在lpBits里面的就是处理后的RGB
//把采集到的位图重新存储成文件
BITMAPFILEHEADER bfh;
CFile file;
bfh.bfType='BM';
bfh.bfSize=ByteSize;
bfh.bfReserved1=0;
bfh.bfReserved2=0;
bfh.bfOffBits=sizeof(BITMAPFILEHEADER);
if(file.Open("g:\\des.bmp" , CFile::modeCreate | CFile::modeWrite) )
{
file.Write(&bfh,sizeof(BITMAPFILEHEADER));
file.Write(lpBits , ByteSize-sizeof(BITMAPFILEHEADER));
file.Close();
}
free(lpBits);
lpBits = NULL;

解决方案 »

  1.   

    你这里面还有一个重要的结构没有写
    BITMAPINFOHEADER
    这个结构在BITMAPFILEHEADER结构写完之后,接着写入,然后就是图象的RGBQUAD(对于16位以上的位图不需要),最后才是你的图像数据lpBits。
      

  2.   

    哦,哪上面那个象素处理的地方对吗?
    我得到的lpBits是象素得RGB值得指针吗
      

  3.   

    先写文件头。
    再写Bitmap信息头。//漏了
    如果有调色板,写调色板。//16位以上就不用了
    写图像数据。