【发布时间】:2015-08-01 09:41:00
【问题描述】:
目前我已经使用 C++ CLR 为 c# 构建了包装器。 C++ clr 类从摄像机获取帧作为 uint8[] 并返回到 C++ 类中的 OnVideoFrame 事件。我有这样的初始化程序:
ZeroMemory(&bmi_, sizeof(bmi_));
bmi_.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi_.bmiHeader.biPlanes = 1;
bmi_.bmiHeader.biBitCount = 32;
bmi_.bmiHeader.biCompression = BI_RGB;
bmi_.bmiHeader.biWidth = width;
bmi_.bmiHeader.biHeight = -height;
bmi_.bmiHeader.biSizeImage = width * height * (bmi_.bmiHeader.biBitCount >> 3);
image_.reset(new uint8[bmi_.bmiHeader.biSizeImage]);
所以问题是:
我已经在 image_ 中有数据,但是如何将该数据发送到 c# 并将其转换为任何 WPF 位图对象以播放我的本地视频流?我正在寻找有关性能的最佳方法以及我使用 WPF 时遇到的问题。我已经有了基本 win32 应用的解决方案:
RECT rcClient;
GetClientRect(VideoRendererInternal->WindowHandle, &rcClient);
PAINTSTRUCT ps;
HDC hdc = BeginPaint(VideoRendererInternal->WindowHandle, &ps);
StretchDIBits(hdc,
0, 0, rcClient.right, rcClient.bottom, // destination rect
0, 0, VideoRendererInternal->bmi_.bmiHeader.biWidth, -VideoRendererInternal->bmi_.bmiHeader.biHeight, // source rect
VideoRendererInternal->image_.get(), &VideoRendererInternal->bmi_, DIB_RGB_COLORS, SRCCOPY);
EndPaint(VideoRendererInternal->WindowHandle, &ps);
但找不到 WPF 的任何解决方案。谢谢!
【问题讨论】: