使用c ++ / MFC缩放图像

时间:2017-09-11 13:30:33

标签: c++ image mfc

我正在尝试为“SMB”文件创建预览,其中它是一种可以使用AutoCAD生成的图像,我必须将此图像加载到宽度为100和高度为100的CRect中。 然而,这个图像具有高分辨率,并且它包含一个非常小的鱼。 创建预览时,仅显示空白区域。在其他情况下,图像的大小合理,正确显示。

我想知道如何缩放图像,我可以放大图像的中心并丢失剩下的部分,只是为了让它保持在CRect对象的范围内。 100宽度和100高度。

以下是我目前正在使用的代码:

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 个答案:

答案 0 :(得分:1)

当您偏移矩形时,您必须同时更改Rect.right::top,与::bottomOffsetRect相同。您可以使用MoveToXYRect

如果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); 矩形的维度:

source

确保destination大于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); ,该函数将如下所示:

StretchBlt

详细了解BitBlt和{{1}},并查看目标和源矩形的说明。