【问题标题】:Scale an image with c++ / MFC使用 c++ / MFC 缩放图像
【发布时间】:2018-02-19 18:27:07
【问题描述】:

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

我想知道如何缩放图像,以一种可以放大图像中心并丢失其余部分的方式,只是为了将其保持在宽度为 100 的 CRect 对象的范围内和 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);

【问题讨论】:

    标签: c++ image mfc


    【解决方案1】:

    当您偏移一个矩形时,您必须同时更改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);
    

    使用GetObjectsource矩形的尺寸:

    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);
    

    阅读有关BitBltStretchBlt 的更多信息,并查看目标和源矩形的描述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 2013-09-29
      • 2021-07-25
      • 2013-01-05
      • 1970-01-01
      相关资源
      最近更新 更多