如何缩放CBitmap对象?

Sma*_*ery 7 c++ mfc gdi+ resize cbitmap

我从资源ID加载了一个CBitmap对象,现在我想在每个维度上将其缩放到50%.我怎么能这样做?

Sys*_*min 5

  1. 选择CBitmap obj到memDC A(使用CDC :: SelectObject())
  2. 创建一个具有所需大小的新CBitmap,并将其选择到另一个MemDC B中
  3. 使用CDC :: stretchblt(...)将MemDC A中的bmp拉伸到MemDC B中
  4. 取消选择CBitmap对象(通过选择先前对SelectObject的调用返回的内容)
  5. 使用新的CBitmap


Fra*_*ger 5

这是@Smashery 答案的一个已完成的实现。

我使用它来基于 DPI 进行缩放,但它应该很容易适应任意缩放。

std::shared_ptr<CBitmap> AppHiDpiScaleBitmap (CBitmap &bmp)
{
    BITMAP bm = { 0 };
    bmp.GetBitmap (&bm);
    auto size = CSize (bm.bmWidth, bm.bmHeight);

    CWindowDC screenCDC (NULL);
    auto dpiX = screenCDC.GetDeviceCaps (LOGPIXELSX);
    auto dpiY = screenCDC.GetDeviceCaps (LOGPIXELSY);

    auto hiSize = CSize ((dpiX * size.cx) / 96, (dpiY * size.cy) / 96);

    std::shared_ptr<CBitmap> res (new CBitmap ());
    res->CreateCompatibleBitmap (&screenCDC, hiSize.cx, hiSize.cy);

    CDC srcCompatCDC;
    srcCompatCDC.CreateCompatibleDC (&screenCDC);
    CDC destCompatCDC;
    destCompatCDC.CreateCompatibleDC (&screenCDC);

    CMemDC srcDC (srcCompatCDC, CRect (CPoint (), size));
    auto oldSrcBmp = srcDC.GetDC ().SelectObject (&bmp);

    CMemDC destDC (destCompatCDC, CRect(CPoint(), hiSize));
    auto oldDestBmp = destDC.GetDC ().SelectObject (res.get());

    destDC.GetDC ().StretchBlt (0, 0, hiSize.cx, hiSize.cy, &srcDC.GetDC(), 0, 0, size.cx, size.cy, SRCCOPY);

    srcDC.GetDC ().SelectObject (oldSrcBmp);
    destDC.GetDC ().SelectObject (oldDestBmp);

    return res;
}
Run Code Online (Sandbox Code Playgroud)