BITMAPINFOHEADER载入图片控件问题

x_jefferson 2013-03-07 10:14:29
mfc基于对话框的程序
现已有BITMAPINFOHEADER,BITMAPFILEHEADER数据,如何加载到图片控件里?
...全文
263 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyuntian 2013-03-08
  • 打赏
  • 举报
回复
CPictureEX
x_jefferson 2013-03-08
  • 打赏
  • 举报
回复
[quote=引用 3 楼 flydreamGG 的回复:] 有BITMAPINFOHEADER还不行,还需要图像数据,要获取图像控件的CDC,然后通过StretchDIBits去画。 自己解决了,还是谢谢你啊
x_jefferson 2013-03-08
  • 打赏
  • 举报
回复
重新问一下吧,有位图信息,byte格式的,有颜色表,int格式的,怎么载入picturebox控件里?
x_jefferson 2013-03-08
  • 打赏
  • 举报
回复
[quote=引用 3 楼 flydreamGG 的回复:] 有BITMAPINFOHEADER还不行,还需要图像数据,要获取图像控件的CDC,然后通过StretchDIBits去画。 有位图数据,要写进picturebox控件里,应该没这么复杂吧
昨夜无风 2013-03-08
  • 打赏
  • 举报
回复
有BITMAPINFOHEADER还不行,还需要图像数据,要获取图像控件的CDC,然后通过StretchDIBits去画。

BOOL WINAPI PaintDIB(HDC     hDC,
					 LPRECT  lpDCRect,
					 HDIB    hDIB,
					 LPRECT  lpDIBRect,
					 CPalette* pPal)
{
	LPSTR    lpDIBHdr;            // BITMAPINFOHEADER指针
	LPSTR    lpDIBBits;           // DIB象素指针
	BOOL     bSuccess=FALSE;      // 成功标志
	HPALETTE hPal=NULL;           // DIB调色板
	HPALETTE hOldPal=NULL;        // 以前的调色板

	// 判断DIB对象是否为空
	if (hDIB == NULL)
	{
		// 返回
		return FALSE;
	}

	// 锁定DIB
	lpDIBHdr  = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIBHdr);

	// 获取DIB调色板,并选中它
	if (pPal != NULL)
	{
		hPal = (HPALETTE) pPal->m_hObject;

		// 选中调色板
		hOldPal = ::SelectPalette(hDC, hPal, TRUE);
	}

	// 设置显示模式
	::SetStretchBltMode(hDC, COLORONCOLOR);

	// 判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
	if ((RECTWIDTH(lpDCRect)  == RECTWIDTH(lpDIBRect)) &&
		(RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect)))
	{
		// 原始大小,不用拉伸。
		bSuccess = ::SetDIBitsToDevice(hDC,                    // hDC
			lpDCRect->left,             // DestX
			lpDCRect->top,              // DestY
			RECTWIDTH(lpDCRect),        // nDestWidth
			RECTHEIGHT(lpDCRect),       // nDestHeight
			lpDIBRect->left,            // SrcX
			(int)DIBHeight(lpDIBHdr) -
			lpDIBRect->top -
			RECTHEIGHT(lpDIBRect),   // SrcY
			0,                          // nStartScan
			(WORD)DIBHeight(lpDIBHdr),  // nNumScans
			lpDIBBits,                  // lpBits
			(LPBITMAPINFO)lpDIBHdr,     // lpBitsInfo
			DIB_RGB_COLORS);            // wUsage
	}
	else
	{
		// 非原始大小,拉伸。
		bSuccess = ::StretchDIBits(hDC,                          // hDC
			lpDCRect->left,                 // DestX
			lpDCRect->top,                  // DestY
			RECTWIDTH(lpDCRect),            // nDestWidth
			RECTHEIGHT(lpDCRect),           // nDestHeight
			lpDIBRect->left,                // SrcX
			lpDIBRect->top,                 // SrcY
			RECTWIDTH(lpDIBRect),           // wSrcWidth
			RECTHEIGHT(lpDIBRect),          // wSrcHeight
			lpDIBBits,                      // lpBits
			(LPBITMAPINFO)lpDIBHdr,         // lpBitsInfo
			DIB_RGB_COLORS,                 // wUsage
			SRCCOPY);                       // dwROP
	}

	// 解除锁定
	::GlobalUnlock((HGLOBAL) hDIB);

	// 恢复以前的调色板
	if (hOldPal != NULL)
	{
		::SelectPalette(hDC, hOldPal, TRUE);
	}

	// 返回
	return bSuccess;
}
x_jefferson 2013-03-08
  • 打赏
  • 举报
回复
引用 1 楼 chenyuntian 的回复:
CPictureEX
能说详细点吗,帮助文档里没有找到这个类

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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