如何从C ++ / CLI中的RenderTargetBitmap获取BITMAP结构?

时间:2010-04-12 20:24:42

标签: .net wpf c++-cli bitmap gdi

我在C ++ / CLI中有一个WPF RenderTargetBitmap,我希望能够从它创建一个BITMAP结构以与BitBlt一起使用。我之前没有使用过BITMAP或RenderTargetBitmap,所以任何想法都会很棒!

2 个答案:

答案 0 :(得分:2)

事实证明,它比简单地使用CopyPixels要复杂一点。

在C ++ / CLI托管代码中,我执行以下操作:

virtual BOOL fillBitmap(CDC* dc, CBitmap* bmp)
{   
  WPFContainer^ page = getWPFContainer();

  // Get a bitmap from the DVE page
  RenderTargetBitmap ^rtb = gcnew RenderTargetBitmap(page->ActualWidth, page->ActualHeight, 96, 96, PixelFormats::Default);
  rtb->Render(page);

  // fill up the passed in bitmap with the bits from WPF
  BITMAPINFO bmi;
  ZeroMemory(&bmi, sizeof(BITMAPINFO));
  bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  bmi.bmiHeader.biWidth = rtb->PixelWidth;
  bmi.bmiHeader.biHeight = -rtb->PixelHeight;   /* Use a Negative height so that we copy the bits from TOP to BOTTOM with CopyPixels below */
  bmi.bmiHeader.biPlanes = 1;
  bmi.bmiHeader.biBitCount = 32;
  bmi.bmiHeader.biCompression = BI_RGB;
  bmi.bmiHeader.biSizeImage = rtb->PixelWidth * rtb->PixelHeight * 4;

  void* pBmpPixels;
  bmp->Attach(CreateDIBSection(*dc, &bmi, DIB_RGB_COLORS, &pBmpPixels, NULL, 0));

  if (NULL != pBmpPixels)
  {
    Int32Rect rTemp(0,0,0,0);
    IntPtr ipTemp(pBmpPixels);
    rtb->CopyPixels(rTemp, ipTemp, bmi.bmiHeader.biSizeImage, rtb->PixelWidth * 4);
  }

  return TRUE;
} override;

然后,我可以从我想要填充的CBitmap中传递的非托管代码中调用该例程。我可以像使用任何原生的CBitmap一样使用它。

答案 1 :(得分:1)

如何'BitmapSource.CopyPixelsSetDIBits一起回合?当然,在通常的CreateCompatibleBitmap / CreateCompatibleDC / SelectObject咒语之后。