Как получить структуру BITMAP из RenderTargetBitmap в C ++ / CLI? - PullRequest
1 голос
/ 13 апреля 2010

У меня есть WPF RenderTargetBitmap в C ++ / CLI, и я хочу иметь возможность создать структуру BITMAP из него для использования с BitBlt. Я не очень много работал с BITMAP или RenderTargetBitmap, поэтому любые мысли были бы великолепны!

Ответы [ 2 ]

2 голосов
/ 09 июня 2010

Оказывается, это было немного сложнее, чем просто использование 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 голос
/ 13 апреля 2010

Как насчет BitmapSource.CopyPixels вместе с SetDIBits ? После обычных заклинаний CreateCompatibleBitmap / CreateCompatibleDC / SelectObject, конечно.

...