从 gdiplus (GDI+) 中的设备上下文或图形对象获取 Image/Bitmap
Get an Image/Bitmap from a device context or graphics object in gdiplus (GDI+)
我正在寻找此 GDI 代码如何从设备上下文获取位图的方法...
void CMFCDlg::OnPaint()
{
CDC dc(this); // Device Context for painting
CBitmap backgroundBmp;
// Get Client Area
CRect clientRect;
GetClientRect(&clientRect);
// Create memory DC
CDC memDC;
memDC.CreateCompatibleDC(&dc);
// Create compatible bitmap
backgroundBmp.CreateCompatibleBitmap(&memDC, clientRect.Width(), clientRect.Height());
// Copy Blt Bits from DC to Bitmap
CBitmap* pOldBmp = dc.SelectObject(&backgroundBmp);
memDC.BitBlt(0, 0, clientRect.Width(), clientRect.Height(), &dc, 0, 0, SRCCOPY);
dc.SelectObject(pOldBmp);
// Release the memory DC
memDC.DeleteDC();
}
...可以在 GDI+ 中完成以接收 GDI+ 图像或位图。
我正在寻找接近此草稿的方法:
void CMFCDlg::OnPaint()
{
CDC dc(this); // Device Context for painting
Bitmap backgroundBmp;
// Get Client Area
CRect clientRect;
GetClientRect(&clientRect);
// Get graphics object from device context
Graphics gr(dc);
// Somehow create a compatible GDI+ bitmap
backgroundBmp = gr.??????
}
我只看到涉及 GDI 对象和资源的代码,这些代码后来被转换为 GDI+ 对象。但是 none 对我有用,我觉得有一种(简单的)其他方法可以在更舒适的 GDI+ 环境中做到这一点。
您只能将 GDI+ 绘制到设备上下文。但是你可以使用内存设备上下文,然后绘制到 dc 或保存到文件:
CClientDC dc(this);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, 100, 100);
CBitmap *oldbitmap = (CBitmap*)memdc.SelectObject(&bitmap);
Gdiplus::Graphics graphics_memdc(memdc);
Gdiplus::Pen pen(Gdiplus::Color(255, 0, 128, 255), 5);
Gdiplus::Rect rect(10, 10, 80, 80);
graphics_memdc.DrawRectangle(&pen, rect);
现在抽到dc
dc.BitBlt(0, 0, 100, 100, &memdc, 0, 0, SRCCOPY);
memdc.SelectObject(oldbitmap);
或使用CImage
将memdc
保存到文件
CImage cimage;
cimage.Create(100, 100, 32);
HDC imageHDC = cimage.GetDC();
::BitBlt(imageHDC, 0, 0, 100, 100, memdc.GetSafeHdc(), 0, 0, SRCCOPY);
cimage.Save(L"c:\test\fileName.jpg", GUID_NULL);
cimage.ReleaseDC();
我正在寻找此 GDI 代码如何从设备上下文获取位图的方法...
void CMFCDlg::OnPaint()
{
CDC dc(this); // Device Context for painting
CBitmap backgroundBmp;
// Get Client Area
CRect clientRect;
GetClientRect(&clientRect);
// Create memory DC
CDC memDC;
memDC.CreateCompatibleDC(&dc);
// Create compatible bitmap
backgroundBmp.CreateCompatibleBitmap(&memDC, clientRect.Width(), clientRect.Height());
// Copy Blt Bits from DC to Bitmap
CBitmap* pOldBmp = dc.SelectObject(&backgroundBmp);
memDC.BitBlt(0, 0, clientRect.Width(), clientRect.Height(), &dc, 0, 0, SRCCOPY);
dc.SelectObject(pOldBmp);
// Release the memory DC
memDC.DeleteDC();
}
...可以在 GDI+ 中完成以接收 GDI+ 图像或位图。
我正在寻找接近此草稿的方法:
void CMFCDlg::OnPaint()
{
CDC dc(this); // Device Context for painting
Bitmap backgroundBmp;
// Get Client Area
CRect clientRect;
GetClientRect(&clientRect);
// Get graphics object from device context
Graphics gr(dc);
// Somehow create a compatible GDI+ bitmap
backgroundBmp = gr.??????
}
我只看到涉及 GDI 对象和资源的代码,这些代码后来被转换为 GDI+ 对象。但是 none 对我有用,我觉得有一种(简单的)其他方法可以在更舒适的 GDI+ 环境中做到这一点。
您只能将 GDI+ 绘制到设备上下文。但是你可以使用内存设备上下文,然后绘制到 dc 或保存到文件:
CClientDC dc(this);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, 100, 100);
CBitmap *oldbitmap = (CBitmap*)memdc.SelectObject(&bitmap);
Gdiplus::Graphics graphics_memdc(memdc);
Gdiplus::Pen pen(Gdiplus::Color(255, 0, 128, 255), 5);
Gdiplus::Rect rect(10, 10, 80, 80);
graphics_memdc.DrawRectangle(&pen, rect);
现在抽到dc
dc.BitBlt(0, 0, 100, 100, &memdc, 0, 0, SRCCOPY);
memdc.SelectObject(oldbitmap);
或使用CImage
将memdc
保存到文件
CImage cimage;
cimage.Create(100, 100, 32);
HDC imageHDC = cimage.GetDC();
::BitBlt(imageHDC, 0, 0, 100, 100, memdc.GetSafeHdc(), 0, 0, SRCCOPY);
cimage.Save(L"c:\test\fileName.jpg", GUID_NULL);
cimage.ReleaseDC();