收录日期:2020/02/20 22:04:22 时间:2016/05/13 13:00:57 标签:图形处理/算法
各位大虾:
    我从一幅24位位图读出数据,想根据这个位图数据重新生成24位的位图。可是就是打不开。源程序如下
      CBitmap* pBitmap = pDoc->GetBitmap() ;//得到源位图指针

if(pBitmap != NULL)
{
DIBSECTION ds ;
pBitmap->GetObject(sizeof(DIBSECTION), &ds) ;
LPSTR lpImage = (LPSTR)ds.dsBm.bmBits ;//指向源位图数据指针
CFile file ;

HGLOBAL hDest ;
hDest = (HGLOBAL)::GlobalAlloc   (GMEM_MOVEABLE|GMEM_ZEROINIT, 
3*ds.dsBm.bmHeight*ds.dsBm.bmWidth+sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)) ;
if(hDest == NULL)
return ;
LPSTR lpDest ;
lpDest = (LPSTR)::GlobalLock((HGLOBAL)hDest) ;

memset(lpDest, 0, 3*ds.dsBm.bmHeight*ds.dsBm.bmWidth+sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)) ;

        BITMAPFILEHEADER* bfh;
        BITMAPINFOHEADER* bih;

        bfh = (BITMAPFILEHEADER*)lpDest ;
        memset(bfh, 0, sizeof(BITMAPFILEHEADER));
        bfh->bfType = 0x4d42;
        bfh->bfSize = sizeof(BITMAPFILEHEADER) + sizeof(
        BITMAPINFOHEADER) + 3*ds.dsBm.bmHeight*ds.dsBm.bmWidth;
        bfh->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(
        BITMAPINFOHEADER) ;
bfh->bfReserved1 = 0 ;
bfh->bfReserved2 = 0 ;

        bih = (BITMAPINFOHEADER*)(bfh + sizeof(BITMAPFILEHEADER)) ;
        memset(bih, 0, sizeof(BITMAPINFOHEADER));
        bih->biSize = sizeof(BITMAPINFOHEADER);
        bih->biWidth = ds.dsBm.bmWidth;
        bih->biHeight = ds.dsBm.bmHeight;
        bih->biPlanes = 1; 
        bih->biBitCount = 24;
bih->biCompression = BI_RGB;
bih->biSizeImage = 3*ds.dsBm.bmWidth*ds.dsBm.bmHeight;
bih->biXPelsPerMeter = 0 ;
bih->biYPelsPerMeter = 0 ;
bih->biClrUsed = 0 ;
bih->biClrImportant = 0 ;
if(!file.Open("d:\\bitmap.bmp",CFile::modeCreate|CFile::modeReadWrite| CFile::shareDenyWrite))
return ;
// file.Write(&bfh, sizeof(BITMAPFILEHEADER)) ;
// ::free(&bfh) ;
// file.Write(&bih, sizeof(BITMAPINFOHEADER)) ;
// ::free(&bih) ;

        LPSTR  pImage ;
pImage = (LPSTR)(bih + sizeof(BITMAPINFOHEADER)) ;
for(int i=0; i<ds.dsBm.bmHeight; i++)
{
for(int j=0; j<ds.dsBm.bmWidth; j++)
{
*(pImage + 3*ds.dsBm.bmWidth + 3*j + 2) = *(lpImage + 3*ds.dsBm.bmWidth + 3*j + 2) ;
*(pImage + 3*ds.dsBm.bmWidth + 3*j + 1) = *(lpImage + 3*ds.dsBm.bmWidth + 3*j + 1) ;
*(pImage + 3*ds.dsBm.bmWidth + 3*j    ) = *(lpImage + 3*ds.dsBm.bmWidth + 3*j    ) ;
}
}

file.WriteHuge(lpDest,3*ds.dsBm.bmHeight*ds.dsBm.bmWidth + sizeof(BITMAPFILEHEADER) + sizeof(
        BITMAPINFOHEADER)) ;
::free((void *)lpDest) ;
         file.Close() ;
}
BITMAPFILEHEADER* bfh;
BITMAPINFOHEADER* bih;

bfh = (BITMAPFILEHEADER*)lpDest ;
看这条语句:

bih = (BITMAPINFOHEADER*)(bfh + sizeof(BITMAPFILEHEADER)) ;
bfh为BITMAPFILEHEADER类型的指针, 如果 bfh+1, 就相当于偏移sizeof(BITMAPFILEHEADER)...而这里则+sizeof(BITMAPFILEHEADER)),相当于偏移了
sizeof(BITMAPFILEHEADER) * sizeof(BITMAPFILEHEADER)
.........

我的感觉这里错误,你实际调试看一下~~~~~~~~

jpeg转mpeg问题 指针问题 安装X264失败,高手帮我看看是什么原因 急:VC控件和成员的关联 在datalist中嵌套RadioButton,然后循环取出值的问题 文件上传“ 不支持给定路径的格式。” 一个jsp聊天室登陆(login.jsp)的错误问题(书上例子代码) u boot中怎样写flash驱动以及串口驱动 Sql Server 2000生成索引信息及自动创建脚本 C数组名的思考 informix 如何添加日志 诚求:用PHP开发数据分析工具的一个项目 求SSH搭建过程 谁有D7的JPGE.PAS,发给我谢谢BYYA@163.COM 【4.28】猎头职位: 关于Tomcat的配置问题 toad导出的数据不完整(元组总数量是完整的,但字段的内容少了一截),怎么解决? 对象声明怎样解剖?请帮忙!急!急!急! 为什么提问不能给分? ASP+access数据库问题 关于三个白子 和三个黑子的问题 大家说下是先conn.close()呢还是先comm.Dispose()呢? Flex 与 WebService 通信的编码问题(高手秒解) 在线等。。。 MySQL 数据库数据插入问题 我怎么样从数据库里面读出所有格式的图片 如何实现让一台电脑只能访问一个指定的外网网址,而不能访问其他网站和上qq,msn等??? WebBrowser响应事件问题 50分向高人求教 在线等 关于ASP.NET+ajax的速度问题 vbscript服务器端,如何让HTML按钮变为不可用 生命中的不能承受之重