Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用WriteableBitmap时缓冲区大小不足?_C#_Wpf_Xaml_Bitmap_Kinect - Fatal编程技术网

C# 使用WriteableBitmap时缓冲区大小不足?

C# 使用WriteableBitmap时缓冲区大小不足?,c#,wpf,xaml,bitmap,kinect,C#,Wpf,Xaml,Bitmap,Kinect,我正在修改ColorBasic Kinect示例,以便显示叠加到视频流上的图像。因此,我所做的是加载一个透明背景的图像(现在是GIF,但它可能会改变),然后写入显示的位图 我得到的错误是我正在写入的缓冲区太小 我看不出实际的错误是什么(我是XAML/C#/Kinect的新手),但可写位图是1920x1080,而我要复制的位图是200x200,所以为什么我会出现这个错误?我看不出透明背景有什么害处,但我开始怀疑 请注意,如果没有最后的WritePixels,代码可以工作,我可以看到网络摄像头的输出

我正在修改ColorBasic Kinect示例,以便显示叠加到视频流上的图像。因此,我所做的是加载一个透明背景的图像(现在是GIF,但它可能会改变),然后写入显示的位图

我得到的错误是我正在写入的缓冲区太小

我看不出实际的错误是什么(我是XAML/C#/Kinect的新手),但可写位图是1920x1080,而我要复制的位图是200x200,所以为什么我会出现这个错误?我看不出透明背景有什么害处,但我开始怀疑

请注意,如果没有最后的WritePixels,代码可以工作,我可以看到网络摄像头的输出。我的代码如下

覆盖图像:

public BitmapImage overlay = new BitmapImage(new Uri("C:\\users\\user\\desktop\\something.gif"));
显示Kinect网络摄像头的回调函数(请参阅默认示例ColorBasic),只需进行非常小的修改:

private void Reader_ColorFrameArrived(object sender, ColorFrameArrivedEventArgs e)
{
    // ColorFrame is IDisposable
    using (ColorFrame colorFrame = e.FrameReference.AcquireFrame())
    {
        if (colorFrame != null)
        {
            FrameDescription colorFrameDescription = colorFrame.FrameDescription;

            using (KinectBuffer colorBuffer = colorFrame.LockRawImageBuffer())
            {
                this.colorBitmap.Lock();

                // verify data and write the new color frame data to the display bitmap
                if ((colorFrameDescription.Width == this.colorBitmap.PixelWidth) && (colorFrameDescription.Height == this.colorBitmap.PixelHeight))
                {
                    colorFrame.CopyConvertedFrameDataToIntPtr(
                        this.colorBitmap.BackBuffer,
                        (uint)(colorFrameDescription.Width * colorFrameDescription.Height * 4),
                        ColorImageFormat.Bgra);

                    this.colorBitmap.AddDirtyRect(new Int32Rect(0, 0, this.colorBitmap.PixelWidth, this.colorBitmap.PixelHeight));
                }

                if(this.overlay != null)
                {
                    // Calculate stride of source
                    int stride = overlay.PixelWidth * (overlay.Format.BitsPerPixel / 8);

                    // Create data array to hold source pixel data
                    byte[] data = new byte[stride * overlay.PixelHeight];

                    // Copy source image pixels to the data array
                    overlay.CopyPixels(data, stride, 0);

                    this.colorBitmap.WritePixels(new Int32Rect(0, 0, overlay.PixelWidth, overlay.PixelHeight), data, stride, 0);
                }

                this.colorBitmap.Unlock();
            }
        }
    }
}

您的
overlay.Format.BitsPerPixel
/8将是1(因为它是gif),但您试图将其复制到非gif的对象,可能是BGRA(32位)。因此,您在大小(4x)上有了巨大的差异


.WritePixels
应该接受目标缓冲区的步长值,但超过它的是覆盖区的步长值(这也可能导致奇怪的问题)


最后,即使它100%平滑,你的叠加实际上不会“叠加”任何东西,它会替换——因为我在你的代码中没有看到任何阿尔法弯曲的数学

将.gif转换为.png(32位),看看是否有帮助

另外,如果你正在寻找AlphaBltMerge类型的代码:我在这里写了全部内容。。这很容易理解