首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何缩放CBitmap对象?

如何缩放CBitmap对象?
EN

Stack Overflow用户
提问于 2010-05-05 13:37:34
回答 3查看 4.8K关注 0票数 7

我已经从一个资源ID加载了一个CBitmap对象,现在我想在每个维度上将其缩放到其大小的50%。我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-05 13:42:32

  1. 将您的CBitmap对象选择到memDC A中(使用CDC::SelectObject())
  2. Create a MemDC CBitmap并具有所需大小,然后使用CDC::CBitmap
  3. (...)将其选择到另一个CBitmap B
  4. 中)要将MemDC A中的bmp扩展到MemDC B
  5. 中,请取消选择您的CBitmap对象(通过选择从之前的调用返回的内容来SelectObject)
  6. Use您的新CBitmap
票数 5
EN

Stack Overflow用户

发布于 2016-06-24 04:08:36

这是@Smashery答案的一个精心设计的实现。

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

代码语言:javascript
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2020-04-16 20:07:01

代码语言:javascript
复制
void ResizeBitmap (CBitmap &bmp_src, CBitmap& bmp_dst, int dstW, int dstH)
{
BITMAP bm = { 0 };
bmp_src.GetBitmap (&bm);
auto size = CSize (bm.bmWidth, bm.bmHeight);
CWindowDC wndDC(NULL);
CDC srcDC;
srcDC.CreateCompatibleDC(&wndDC);
auto oldSrcBmp = srcDC.SelectObject(&bmp_src);

CDC destDC;
destDC.CreateCompatibleDC(&wndDC);
bmp_dst.CreateCompatibleBitmap (&wndDC, dstW, dstH);
auto oldDestBmp = destDC.SelectObject (&bmp_dst);

destDC.StretchBlt(0, 0, dstW, dstH, &srcDC, 0, 0, size.cx, size.cy, SRCCOPY);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2770855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档