DIB写入问题

smdszgzh 2009-07-15 05:49:11

BOOL CTwain::WriteDIB(LPTSTR szFile, HANDLE hDIB)
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;

if (!hDIB)
return FALSE;

CFile file;
if(!file.Open( szFile, CFile::modeWrite))
return FALSE;

lpbi = (LPBITMAPINFOHEADER)hDIB;

int nColors = 1 << lpbi->biBitCount;

// Fill in the fields of the file header
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"
hdr.bfSize = GlobalSize (hDIB) + sizeof( hdr );
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) (sizeof( hdr ) + lpbi->biSize +
nColors * sizeof(RGBQUAD));

// Write the file header
file.Write( &hdr, sizeof(hdr) );

// Write the DIB header and the bits
int x=GlobalSize(hDIB);
file.Write(lpbi, GlobalSize(hDIB) ); //执行这句会出严重的错误,我传的参数是HBITMAP句柄,
//不知道会不会有问题 ,句柄有值,lpbi也是有效的,是不是lpbi指向的是一快无效的内存,所以会出错??
return TRUE;
}
...全文
33 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yofoo 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 smdszgzh 的帖子:]
C/C++ code
file.Write(lpbi, GlobalSize(hDIB) ); //执行这句会出严重的错误,我传的参数是HBITMAP句柄,
[/Quote]

参数 HANDLE hDIB 是一块内存, 用 HBITMAP句柄 肯定是不对的
jameshooo 2009-07-17
  • 打赏
  • 举报
回复
这段代码很熟,好像是CodeProject或者CodeGuru上的一位达人写的,很可惜的是这句代码有严重问题:

lpbi = (LPBITMAPINFOHEADER)hDIB;

我测试过了,这个转换并不成立,不知这位前辈是怎么推测出来的。无论hDIB所指示的HANDLE是HBITMAP还是HDIBSECTION都不能这样转换,GDI出于对内部数据的保护,不会傻到直接把数据结构指针给共享出来吧。
zhangyan_wt 2009-07-15
  • 打赏
  • 举报
回复
lpbi不需要GlobalLock么,hDIB是怎么分配的
smdszgzh 2009-07-15
  • 打赏
  • 举报
回复
10000+的一个数值
快乐鹦鹉 2009-07-15
  • 打赏
  • 举报
回复
int x=GlobalSize(hDIB);
x=???

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧