如何从BitmapSource或PlanarImage(来自Kinect)获取pRgb32图像缓冲区?

时间:2011-09-01 03:29:23

标签: c# wpf image-processing bufferedimage kinect

我正在尝试将PlanarImage位转换为WPF应用程序上的pRgb32buffer,以便在VcamSDK提供的虚拟网络摄像头上显示它。我不知道pRgb32buffer是什么,但是e2eSoft需要它作为VcamSDK中的Overlay参数。有关addOverlay方法的文档如下:

HRESULT AddOverlay([in] VARIANT pRgb32Buffer, [in] ULONG width, [in] ULONG height
    , [in] LONG px, [in] LONG py, [in] ULONG whichOne);
Add an image overlay to current VCam video.
pRgb32Buffer: overlay image buffer, in RGB32 format (with alpha channel), size is
    [width x height], if it's NULL, this overlay (whichOne) will be removed; 
px, py: overlay position, [0, 0] is left-top point;
whichOne: VCam support 5 image overlay (0~4).

PlanarImage的代码如下,PixelFormat是Bgr32,所以也需要一点转换;

void _nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
    PlanarImage Image = e.ImageFrame.Image;
    video.Source = BitmapSource.Create(
        Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, 
            Image.Bits, Image.Width * Image.BytesPerPixel);

我在Google上搜索了pRgb32,但只发现了有限的信息,并且没有关于vCam SDK的示例文档。

我不是图像处理的专家,所以任何帮助都表示赞赏!谢谢!


编辑:

我想我可以使用SDK中也存在的PlayVideoFile(string fileName);方法,但需要显示Uri图像。我无法将其保存到硬盘驱动器上以限制我的应用程序(我可能会多次更改图像并从图像制作流式视频,如果我尝试保存它,运行时会给我一个错误,它当前在使用),我不配偶有黑客或反正将布局上的图像作为Uri参数发送?


更新:

我已经成功进行了下面的位转换,因为我知道Kinect没有使用Alpha通道,因此它发送了所有Alpha位0.首先我解决了这个问题(图像因0 alpha而不可见),然后我已完成从BGRA(Kinect)到ABGR(所需像素格式)的以下转换。该文件有点妄想,说它是带有alpha通道的RGB格式,花了一点时间才能理解真正的格式是ABGR。

以下是转换:

   for (int i = 0; i < myBits.Length; i+=4)
   {
       for (int j = 0; j < 4; j++)
       {
            tempBit = myBits[i + j];
            myBits[i + j] = myBits[i + 3];
            myBits[i + 3] = tempBit;
        }
        myBits[i] = 255;
    }

如果有人能以更有效的方式帮助我做到这一点,我很乐意接受他们的答案。否则我不知道如何结束问题?

1 个答案:

答案 0 :(得分:0)

我想你可以简单地删除内部,并执行:


for (int i = 0; i < myBits.Length; i+=4)
{
    myBits[i+3] = myBits[i+2];
    myBits[i+2] = myBits[i+1];
    myBits[i+1] = myBits[i];
    myBits[i] = 255;
}