收录日期:2019/09/19 00:18:32 时间: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)
.........

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

JS 刷新随机控制DIV的的位置 求漫画图片 求漫画图片 共地问题 基础问题,如果给外键赋值 求漫画图片 动态表查询 怎么天天更新 基础问题,如果给外键赋值 如何使用timer控件实现窗体每隔两秒切换一张(就如同腾讯迷你首页一样的) 我列个去 ”CSDN 错误404你懂得“ 关于javascript登录验证问题 从数据库某表某字段中读出空值,怎么会报空指针的错误呢? 谁配置过cacti?我安装好了 但是获取不到数据 也不显示图形 发不了帖了吗 我列个去 ”CSDN 错误404你懂得“ 做外包的朋友们进来,看看,讲讲,说说; 关于javascript登录验证问题 android4.0系统下不能全屏播放视频。 关于split的正则表达式 “GridView1”激发了未处理的事件“PageIndexChanging” JDK 64位 struts2中ognl的Date转换问题. printf总是会把一个char提升为int么? MFC中自己创建工具栏的问题! <<中国相亲活动>>项目策划书 sql参数化的一个问题 c#时钟问题,急需大家帮忙,拜托了!!! 如何更好的调试windows service sql server编辑表的时候反应很慢,求解决方案! 今天突然 打开EXCEL文件时报实时错误\'-2147417846(8001010a)\'