使用C++ / MFC缩放图像

3
我正在尝试创建“SMB”文件的预览图,其中这是一种可以使用AutoCAD生成的图像,我必须将此图像加载到具有100宽度和100高度的CRect中。 然而,该图像具有很高的分辨率,并且其中包含一个非常小的鱼的绘制。 当预览被创建时,只显示白色空间。 在其他图像具有合理大小的情况下,其显示正确。
我想知道如何缩放图像,以使我可以在图像中心放大并失去其余部分,仅保留在100宽度和100高度的CRect对象的限制范围内。
这是我目前正在使用的代码:
HBITMAP hBitmap;
hBitmap = CreateDIBitmap(pDc->m_hDC, 
                        &EnteteSymb.BitmapInfoHeader,                           
                        (LONG)CBM_INIT, 
                        EnteteSymb.BitmapData,
                        (LPBITMAPINFO)&EnteteSymb.BitmapInfoHeader, 
                        DIB_RGB_COLORS);
CDC DCMem;
DCMem.CreateCompatibleDC(pDc);
DCMem.SelectObject(hBitmap);

int X       = Rect.left + MARGES_X;
int Y       = Rect.top  + MARGES_Y;
int Width   = Rect.right - Rect.left - ( 2 * MARGES_X );
int Height  = ( Rect.bottom ) - ( Rect.top + MARGES_Y ) - 1;

pDc->StretchBlt( X, Y, Width, Height, &DCMem, 0, 0, 100, 100,  SRCCOPY);

DCMem.DeleteDC();
DeleteObject(hBitmap);
1个回答

2
当您偏移一个矩形时,必须同时更改Rect.leftRect.right,同样适用于::top::bottom。您可以使用OffsetRectMoveToXY
如果Rect是宽度和高度均为100的目标矩形,请使用以下内容:
int margin_x = 10;
int margin_y = 10;
CRect Rect(0, 0, 100, 100);
Rect.MoveToXY(margin_x, margin_y);

使用 GetObject 查找 source 矩形的尺寸:

BITMAP bm;
GetObject(hBitmap, sizeof(bm), &bm);
CRect source(0, 0, bm.bmWidth, bm.bmHeight);

请确保矩形大于目标矩形。然后使用BitBlt进行一对一映射。

if(source.Width() > Rect.Width() && source.Height() > Rect.Height())
{
    int x = (source.Width() - Rect.Width()) / 2;
    int y = (source.Height() - Rect.Height()) / 2;
    dc.BitBlt(Rect.left, Rect.top, Rect.Width(), Rect.Height(), &memdc, x, y, SRCCOPY);
}

StretchBlt通常用于将整个图像适配到目标矩形中。如果您要使用StretchBlt函数,则函数应如下所示:

dc.StretchBlt(Rect.left, Rect.top, Rect.Width(), Rect.Height(), 
    &memdc, x, y, Rect.Width(), Rect.Height(), SRCCOPY);

了解更多关于BitBltStretchBlt,并查看目标矩形和源矩形的描述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接