我已经从资源 ID 加载了一个 CBitmap 对象,现在我想将它在每个维度上缩放到其大小的 50%。我该怎么办?
问问题
4862 次
3 回答
5
- 将您的 CBitmap obj 选择到 memDC A 中(使用 CDC::SelectObject())
- 创建一个具有所需大小的新 CBitmap 并将其选择到另一个 MemDC B
- 使用 CDC::stretchblt(...) 将 MemDC A 中的 bmp 拉伸到 MemDC B
- 取消选择您的 CBitmap 对象(通过选择从先前调用 SelectObject 中返回的内容)
- 使用你的新 CBitmap
于 2010-05-05T05:42:31.963 回答
2
这是@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;
}
于 2016-06-23T20:08:36.293 回答
0
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);
}
于 2020-04-16T12:07:00.957 回答