c++ - 使用 C++/MFC 缩放图像

标签 c++ image mfc

我正在尝试为“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.leftRect.right,与 ::top 相同>::底部。您可以使用 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);

确保 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/

相关文章:

c++ - MingW 报告 Netbeans + Qt 中缺少 .dll 文件

c++ - 使用基本模板标识符时继承

c++ - 如何通过 InvokeHelper 传递 HWND 以调用 .NET COM 对象?

c++ - 如何在 mfc CListCtrl 中实现简单的复制/粘贴功能?

c++ - 性能测量 : time vs tick?

php - 通过curl在PHP中获取用户个人资料图像不起作用

css - Twitter Bootstrap 3.0 响应式 IMG 高度问题

带有类别的 Jquery 图片库

c++ - MFC 编辑控件消息句柄访问文档对象

c++ - 针对 MFC42 的 Visual Studio 2015 链接