使用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);
...全文
593 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
没高手指点吗?...
内容概要:本文针对风电功率随机波动对电网频率稳定性的不利影响,提出一种基于灰狼优化算法(GWO)与改进的自适应噪声完备集合经验模态分解(ICEEMDAN)相结合的混合储能功率平抑策略。通过GWO优化ICEEMDAN的关键参数(如噪声幅值、分解层数),以样本熵为适应度函数提升风电功率信号分解精度,有效抑制模态混叠问题;进而构建四阶段协同调控框架:参数优化—自适应分解—互信息熵初级功率分层—模糊控制动态修正中频功率分配,实现低频、中频、高频波动功率的合理分配。该策略结合储能系统中蓄电池与超级电容的特性,利用模糊控制器根据两者实时荷电状态(SOC)动态调整中频功率分配比例,避免过充过放,延长设备寿命。基于实测风电数据的仿真结果表明,该方法显著降低了并网功率波动率,提升了储能运行安全性与系统整体平抑效果。; 适合人群:具备一定电力系统、新能源并网、储能控制背景,熟悉Matlab/Simulink仿真工具,从事相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决风电功率波动导致的电网频率不稳定问题;②优化混合储能系统(蓄电池+超级电容)的功率分配策略;③提升风电并网电能质量与储能系统运行寿命;④为基于智能算法的新能源功率平滑控制提供可复现的技术方案。; 阅读建议:建议结合Matlab代码与Simulink仿真模型进行实践,重点关注GWO参数寻优流程、ICEEMDAN分解效果对比、互信息熵判据应用及模糊规则设计等核心模块,深入理解信号分解与储能状态协同控制的闭环机制。

19,464

社区成员

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

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