使用SetDIBitsToDevice()函数拉伸显示BMP图像的方法

andyboliu 2012-09-14 01:33:03
在对话框中动态加载BMP到指定IDC_STATIC_SHOW控件上,代码可以实现显示功能,但由于控件IDC_STATIC_SHOW大小小于要显示的BMP图像大小,所以只有左上角一部分图像显示出来了,我想把所有图像缩放后显示到控件上,不知道应当如何实现?(由于是基于CImg类做的,所以想使用SetDIBitsToDevice()函数调用imgInput.m_lpData, (BITMAPINFO*)imgInput.m_pBMIH等参数显示图像,请问代码如何修改?
现在代码如下:
//在指定区域内显示图像
CWnd* wnd= GetDlgItem(IDC_STATIC_SHOW);
CDC* pDC = wnd->GetDC();
CRect rect;
wnd->GetClientRect( &rect );
if (imgInput.IsValidate())
{

for(int i=0; i<imgInput.m_pBMIH->biHeight; i++)
{
::SetStretchBltMode(pDC->m_hDC, COLORONCOLOR);//设置图像的拉伸方式
::SetDIBitsToDevice(*pDC, 0, 0, rect.Width(),
rect.Height(), 0, 0, i, 1, imgInput.m_lpData[i], (BITMAPINFO*)imgInput.m_pBMIH, DIB_RGB_COLORS);

}
}
ReleaseDC(pDC);
...全文
496 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
andyboliu 2012-09-18
  • 打赏
  • 举报
回复
多谢2楼的指点,问题解决了,我把demo框架又看了一遍,发现之前所以不能用StretchDIBits()是由于,框架中图像lpBits的内存存储是一行一行申请的内存,不连续,把整幅图像的内存申请成一块连续的就可以了,那个框架太坑爹了...
andyboliu 2012-09-17
  • 打赏
  • 举报
回复
又了解了一下StretchDIBits()函数,CONST VOID *lpBits参数应该就是我使用的类中的imgInput.m_lpData(图像数据指针),而参数CONST BITMAPINFO *lpBitsInfo我使用的类中没有直接的输出,typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO 好像现在的主要问题是如何使用对于BITMAPINFO 对象初始化,(BITMAPINFO*)imgInput.m_pBMIH应该可以直接对于BITMAPINFOHEADER bmiHeader赋值的,那RGBQUAD bmiColors[1]应该如何赋值哪?
andyboliu 2012-09-17
  • 打赏
  • 举报
回复
我也看到很多人使用的是这个函数进行缩放,但好像这个函数使用的“CONST VOID *lpBits”好像是bitmap指针,而加载时使用的是 load()好像是按bmp地址加载的。但我使用的CImg类定义了一个imginput,里面的接口使用的imgInput.m_lpData, (BITMAPINFO*)imgInput.m_pBMIH,直接处理数据并使用图像数据显示,如果想使用StretchDIBits是不是要算法处理后再保存,然后再按地址加载?那样的话,就必须先保存处理后的图像数据到硬盘,而我不想处理后就保存。请问能使用imgInput.m_lpData, (BITMAPINFO*)imgInput.m_pBMIH参数调用StretchDIBits函数吗?如果能够的话,应该如何调用?[Quote=引用 2 楼 的回复:]
C/C++ code

int StretchDIBits(
HDC hdc, // handle to DC
int XDest, // x-coord of destination upper-left corner
int YDest, // y-coo……
[/Quote]

the_venus 2012-09-16
  • 打赏
  • 举报
回复
int StretchDIBits(
HDC hdc, // handle to DC
int XDest, // x-coord of destination upper-left corner
int YDest, // y-coord of destination upper-left corner
int nDestWidth, // width of destination rectangle
int nDestHeight, // height of destination rectangle
int XSrc, // x-coord of source upper-left corner
int YSrc, // y-coord of source upper-left corner
int nSrcWidth, // width of source rectangle
int nSrcHeight, // height of source rectangle
CONST VOID *lpBits, // bitmap bits
CONST BITMAPINFO *lpBitsInfo, // bitmap data
UINT iUsage, // usage options
DWORD dwRop // raster operation code
);

是用的这个函数!
andyboliu 2012-09-14
  • 打赏
  • 举报
回复
up
没高手指点吗?...

19,469

社区成员

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

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