我正在尝试为“SMB”文件创建预览,其中它是一种可以使用 AutoCAD 生成的图像,我必须将此图像加载到宽度为 100 的 CRect
和 100 高度。
然而这张图片的分辨率很高,里面画了一条非常小的鱼。
创建预览时,仅显示空白。在其他情况下,如果图片大小合理,则可以正确显示。
我想知道如何缩放图像,以一种我可以放大图像中心并丢失其余部分的方式,只是为了将其保持在 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);
最佳答案
当您偏移一个矩形时,您必须同时更改 Rect.left
和 Rect.right
,与 ::top
和 相同>::底部
。您可以使用 OffsetRect
或 MoveToXY
。
如果 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);
确保 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);
阅读更多关于 BitBlt
的信息和 StretchBlt
并查看目标和源矩形的描述。
关于c++ - 使用 C++/MFC 缩放图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46156945/