StretchBlt如何获得源矩形(即想要插入的图片的)宽度及高度,用哪个函数
答案:2 悬赏:70 手机版
解决时间 2021-01-24 08:36
- 提问者网友:风月客
- 2021-01-24 05:37
StretchBlt如何获得源矩形(即想要插入的图片的)宽度及高度,用哪个函数
最佳答案
- 五星知识达人网友:孤老序
- 2021-01-24 06:20
函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩。
x:逻辑单元x轴左上角坐标;
y:逻辑单元y轴左上角坐标;
nWidth: 设备矩形宽度;
nHeight:设备矩形高度;
pSrcDC: 源设备上下文;
xSrc :源矩形 x轴左上角坐标;
ySrc: 源矩形y 轴左上角坐标;
Specifies the x-coordinate (in logical units) of the upper-left corner of the source rectangle.
nSrcWidth:源矩形宽度;
nSrcHeight:源矩形高度
dwRop:指定要进行的光栅操作。
x:逻辑单元x轴左上角坐标;
y:逻辑单元y轴左上角坐标;
nWidth: 设备矩形宽度;
nHeight:设备矩形高度;
pSrcDC: 源设备上下文;
xSrc :源矩形 x轴左上角坐标;
ySrc: 源矩形y 轴左上角坐标;
Specifies the x-coordinate (in logical units) of the upper-left corner of the source rectangle.
nSrcWidth:源矩形宽度;
nSrcHeight:源矩形高度
dwRop:指定要进行的光栅操作。
全部回答
- 1楼网友:不如潦草
- 2021-01-24 07:05
具体要看你是怎么载入图片的,一般有2种做法:
1是用Windows的API直接读取位图文件,这需要你清楚位图文件的构成。位图文件有3部分构成:
1位图文件头--BITMAPFILEHEADER,
2位图信息头--BITMAPINFOHEAD,
3是位图数据。
你要的东西就在位图信息头里,这里面有着位图详细的信息(位图大小,高和度都在里面),详细见MSDN,读取时用CFile类的Read函数就可以,读取位图文件的3部分后用StretchDIBits把位图写到你指定的用来做源的CDC设备上下文中,以后你调用StretchBlt时就有源矩形的宽度及高度了,这个方法做起来好麻烦的!
2创建一个与显示窗口兼容的DC,是用LoadImage函数载入位图得到一个HBITMAP的句柄,创建一个CBitmap类对象,用对象绑定前面的句柄,设置一个BITMAP变量bm,CMitmap类有个函数GetBitmap可以获得你要的信息(放入了bm中),把CBitmap对象放入到你创建的与显示窗口兼容的DC里,你就可以用StretchBlt函数了,注意源就是你创建的与窗口兼容的DC,这个方法比前面那个稍为简单点。但也麻烦!
最好的方法是用GDI+,建2个对象,一个Graphics对象,一个Imgae对象,你要的宽度和高度信息用Image对象的获取宽度和高度信息的函数就能得到,最主要的是建立Image对象超简单:Image myImage("你的位图文件名");把对象myImage传给Graphics对象,一下就能按你想的缩放来显示图片了!
最后给你一个方法2的代码,你变通下可以用的:
ShowBMP(CDC* pDC)
{
//注意pDC是指你的显示窗口的设备上下文
CDC * pMemDC = new CDC; // 内存显示DC
pMemDC->CreateCompatibleDC(pDC); // 创建与当前DC兼容的DC
// 从位图文件中载入位图数据,并返回位图的句柄
//m_strFileName注意是你的位图文件名
HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), m_strFileName,
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
CBitmap bitmap; // CBitmap类对象
bitmap.Attach(hBitmap); // 绑定位图数据
BITMAP bm;
// 到下面你要的信息已经放入变量bm中了
bitmap.GetBitmap(&bm);
pMemDC->SelectObject(&bitmap); //这是把位图对象放入源DC中去
CRect rect;
GetClientRect(rect); //这里是获取你的显示窗口的客户区
pMemDC->SetStretchBltMode(COLORONCOLOR);
// 绘制位图
pDC->StretchBlt(0,0,rect.x,rect.y,pMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
//delete pMemDC;
}
代码我没验证,具体应用到你的工程要看你的理解了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯