【问题标题】:How to get an BITMAP struct from a RenderTargetBitmap in C++/CLI?如何从 C++/CLI 中的 RenderTargetBitmap 获取 BITMAP 结构?
【发布时间】:2011-02-07 04:26:15
【问题描述】:

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

【问题讨论】:

  • 你到底想做什么? BitBlt 不使用位图,它适用于设备上下文 (DC)
  • 但是你必须在源上下文中选择一个 HBITMAP...

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


【解决方案1】:

事实证明,它比简单地使用 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 一样使用它。

【讨论】:

    【解决方案2】:

    BitmapSource.CopyPixelsSetDIBits 怎么样?当然,在通常的 CreateCompatibleBitmap / CreateCompatibleDC / SelectObject 咒语之后。

    【讨论】:

    • 谢谢,本。我会试试这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多