我写了一个把24位位图显示的小程序,可是位图和原位图的显示差别很大
完全乱了,24位没有调色板的。大家帮兄弟看看
还有,位图是从下到上倒着读的,我不知道弄得对不对,需要工程的话我可以
给大家个下载地址void CAADlg::OnButton2() 
{
 struct BmpData
 {
 BYTE BLUE;
 BYTE GREEN;
 BYTE RED;
 };
 BmpData dt;
 char bb[10];
 CBitmap b;
     CFile f;
 f.Open("c:\\bb.bmp",CFile::modeRead);
 BITMAPFILEHEADER bh;
 BITMAPINFOHEADER bo;
 int width;
 int pos;
 int heigth;
 f.Read(&bh,sizeof(bh));
 f.Read(&bo,sizeof(bo));
          width = bo.biWidth;
 height = bo.biHeight;
 
 CDC *dc = GetDC();
          int x,y;
 x=1;
          y=height; //y的初始值是位图的高度,然后要倒着读
 long ioff;
 pos = 0;
 ioff = sizeof(bh) + sizeof(bo);  while(TRUE)
 {
   if(f.GetPosition() == f.GetLength())
   {
   break;
   }
          //读红绿蓝颜色分量
         f.Read(&dt.RED,sizeof(BYTE));
f.Read(&dt.GREEN,sizeof(BYTE));
f.Read(&dt.BLUE,sizeof(BYTE));
dc->SetPixel(x,y,RGB(dt.RED,dt.GREEN,dt.BLUE));
//如果x%width==0 表示已经读完了一行,则y轴坐标减1,x轴置为初始值1
                   if(x%width==0)
{
    x = 1;
    y -- ;
}
else
{
x++;
}
 }
     f.Close();
}我昨天晚上的结果是位图基本能显示出来,但是扭曲,还有就是好像是右边的一般显示在左边,左边的一般
显示在右边,好像人的左右脸交换过似的,但是大体上有个图像的样子,颜色搭配也和原图一样
大家赶紧帮我看看,谢谢了 

解决方案 »

  1.   

    读取bmp,很少看见象楼主这么写法的,写法比较奇怪,24位的位图中,是没有调色板的,除了54个字节的文件头结构,剩下的全是图像数据了,,楼主可以根据图像的大小,new一个合适的buffer,将所有的数据全部读出,然后调用bilbit显示出来就可以了,搞这么复杂干吗???不明白
      

  2.   

    兄弟,你的处理流程是对的啊,但你读的时候rgb颜色读反了,应该是bgr的顺序读,不过你的哪个BmpData的结构为什么又定义对了呢?
    不过你的程序代码代码写得不太地道
    如过你f.read(&dt,sizeof(BmpData)),也看着顺服,而且哪个问题也没了
      

  3.   

    哎,求人不如靠自己,我自己已经解决了 ,代码和详细的方法请看我的blog
    http://www.84250.com/blog