StretchBlt中如何按图片比例进行缩放?

时间:2022-06-19 22:42:11
我用StretchBlt缩放显示图片的时候,发现如果用:
StretchBlt(pDC->m_hDC,0,0,rect.right-rect.left,rect.bottom-rect.top,pDoc->memDC.m_hDC,0,0,Image.Width,Image.Height,SRCCOPY);
来缩放的话,如果图片和显示区域的长宽比不一样,那么图片的长宽比就会变形。

那么如果我要在所放的时候,保持图片的长宽比,应该怎么办呢?
还是只能够自己手动计算应该缩放的区域,然后调整缩放范围呢?

3 个解决方案

#1


只能自己手动计算,因为参数里面就没有控制缩放比例的接口

你可以使用setviewportorg等等那几个函数实现视觉上的等比例缩放

#2


自己计算

#3


BITMAP bmHeader;
      pBitmap->GetBitmap(&bmHeader)

//计算按原图比例缩小后的图片的大小
nWidth=bmHeader.bmWidth;
nHeight=bmHeader.bmHeight;
if (nWidth>nHeight && nWidth>rect.Width())
   //如果原图宽度大于高度,且比显示区域的宽度大
{
float zoom=(float)nHeight/(float)nWidth;
nWidth=rect.Width();
nHeight=(int)(zoom * nWidth);
}
else if(nHeight > nWidth && nHeight > rect.Height())
    //如果原图高度大于宽度,且比显示区域的高度大
{
float zoom=(float)nWidth/nHeight;
nHeight=rect.Height();
nWidth=(int)(zoom * nHeight);
}

#1


只能自己手动计算,因为参数里面就没有控制缩放比例的接口

你可以使用setviewportorg等等那几个函数实现视觉上的等比例缩放

#2


自己计算

#3


BITMAP bmHeader;
      pBitmap->GetBitmap(&bmHeader)

//计算按原图比例缩小后的图片的大小
nWidth=bmHeader.bmWidth;
nHeight=bmHeader.bmHeight;
if (nWidth>nHeight && nWidth>rect.Width())
   //如果原图宽度大于高度,且比显示区域的宽度大
{
float zoom=(float)nHeight/(float)nWidth;
nWidth=rect.Width();
nHeight=(int)(zoom * nWidth);
}
else if(nHeight > nWidth && nHeight > rect.Height())
    //如果原图高度大于宽度,且比显示区域的高度大
{
float zoom=(float)nWidth/nHeight;
nHeight=rect.Height();
nWidth=(int)(zoom * nHeight);
}