问一个函数的移植问题CreateDIBitmap

liuyuw 2004-09-14 09:22:25
我在VC6里有用到CreateDIBitmap(),但是在EVC里没有这个函数,evc里有没有和这个功能一样的函数?
myDIB = ::CreateDIBitmap(hDC,&m_BmpInfo->bmiHeader,
CBM_INIT,m_BmpImage,m_BmpInfo,DIB_RGB_COLORS);
...全文
188 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
FIFO2003 2004-09-16
  • 打赏
  • 举报
回复
up
载舟之水 2004-09-16
  • 打赏
  • 举报
回复
方法二搞错了,重来,你要调试一下,我临时写的,没调试。
(适用24位位图数据,如果你要显示256色,lpSrcDIB+40处 要修改)
HBITMAP DIBTohBitmap(HDC m_hDC,LPSTR lpSrcDIB)
{
HBITMAP hBitmap = NULL;
HBITMAP hOldBmp = NULL;
HDC hTmpDC = NULL;
BITMAPINFOHEADER* bitmapheader = (BITMAPINFOHEADER*)lpSrcDIB;
hBitmap = CreateCompatibleBitmap(m_hDC,
bitmapheader->biWidth,-(bitmapheader->biHeight));
hTmpDC=CreateCompatibleDC(m_hDC);
hOldBmp=(HBITMAP)SelectObject(hTmpDC,hBitmap);

StretchDIBits(hTmpDC,0,0,bitmapheader->biWidth,
-bitmapheader->biHeight,0,0,bitmapheader->biWidth,
-bitmapheader->biHeight,lpSrcDIB+40,(BITMAPINFO*)lpSrcDIB,
DIB_RGB_COLORS,SRCCOPY);

SelectObject(hTmpDC,hOldBmp);
DeleteDC(hTmpDC);
return hBitmap; //记得外面用完释放
}
//其中StretchDIBits 需要 WinCE 4.0以上
载舟之水 2004-09-16
  • 打赏
  • 举报
回复
方法二,在任何情况下,数据都是正确的。但是比上面慢几十至上百毫秒。
HBITMAP DIBTohBitmap(HDC m_hDC,LPSTR lpSrcDIB)
{
HBITMAP hBitmap = NULL;
HBITMAP hOldBmp = NULL;
HDC hTmpDC = NULL;
BITMAPINFOHEADER* bitmapheader = (BITMAPINFOHEADER*)lpSrcDIB;
hBitmap = CreateCompatibleBitmap(m_hDC,
bitmapheader->biWidth,-(bitmapheader->biHeight));
hTmpDC=CreateCompatibleDC(m_hDC);
hOldBmp=(HBITMAP)SelectObject(hTmpDC,hBitmap);

StretchDIBits(hTmpDC,0,0,bitmapheader->biWidth,
-bitmapheader->biHeight,0,0,bitmapheader->biWidth,
-bitmapheader->biHeight,m_pcBitmap,(BITMAPINFO*)pcInfo,
DIB_RGB_COLORS,SRCCOPY);

SelectObject(hTmpDC,hOldBmp);
DeleteDC(hTmpDC);
return hBitmap; //记得外面用完释放
}
//其中StretchDIBits 需要 WinCE 4.0以上
载舟之水 2004-09-16
  • 打赏
  • 举报
回复
这个函数的作用是从指向DIB数据的指针转换为位图句柄。
EVC中没有这个函数,所以要自己实现,实现方式我估计有两种,我贴上我自己想到的方法,这种方法缺点是速度慢些,但是数据正确。还有一种是速度较快,但是数据可能有误差,适合对图像要求不是很精确的环境。你如果发现更好的方法记得贴出来,别忘了。


1. 方法一,速度快,但是在某些特定的情况下,颜色显示不对,但数据其实是对的。

#define WIDTHBYTES(bits) ((((bits) + 31)>>5)<<2)
/**************************************************************************************

DIBTohBitmap 将DIB数据指针(24位)
返回 图像句柄(用完以后记得删除)

**************************************************************************************/
HBITMAP DIBTohBitmap(LPSTR lpSrcDIB)
{

HDC hDC = NULL,hSourceDC = NULL;
HBITMAP hSourceBitmap = NULL, hOldSourceBitmap = NULL;
DWORD dwSourceBitsSize;
VOID *lpSourceBits=NULL;
LPSTR lpTmp=NULL;

LPBITMAPINFOHEADER lpbitmapinfoheader;
hDC = GetDC(NULL);
hSourceBitmap = CreateDIBSection( hDC, (const BITMAPINFO*)lpSrcDIB,
DIB_RGB_COLORS,
&lpSourceBits, NULL, 0 );

ReleaseDC( NULL, hDC );

lpbitmapinfoheader=(LPBITMAPINFOHEADER)lpSrcDIB;

dwSourceBitsSize = lpbitmapinfoheader->biHeight *WIDTHBYTES(lpbitmapinfoheader->biWidth*24);

lpTmp=lpSrcDIB+40;

if (lpSourceBits!=NULL)
CopyMemory( lpSourceBits, lpTmp, dwSourceBitsSize );

return hSourceBitmap;
}

cjyun 2004-09-16
  • 打赏
  • 举报
回复
没有,必须自己写,你可以搜一下,这里是有的。搜索 保存图片就行
rzsheng 2004-09-16
  • 打赏
  • 举报
回复
要看EVC下面有没有 显示bmp的函数库

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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