Как вы масштабируете объект CBitmap? - PullRequest
6 голосов
/ 05 мая 2010

Я загрузил объект CBitmap из идентификатора ресурса, и теперь я хочу увеличить его до 50% его размера в каждом измерении. Как я могу пойти по этому поводу?

Ответы [ 2 ]

5 голосов
/ 05 мая 2010
  1. Выберите ваш CBitmap obj в memDC A (используя CDC :: SelectObject ())
  2. Создайте новый CBitmap нужного размера и выберите его в другом MemDC B
  3. Используйте CDC :: stretchblt (...), чтобы растянуть bmp в MemDC A в MemDC B
  4. Отмените выбор объектов CBitmap (выбрав то, что было возвращено из предыдущих вызовов SelectObject)
  5. Используйте ваш новый CBitmap
1 голос
/ 23 июня 2016

Вот отработанная реализация ответа @ 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;
}
...