我正在修改ColorBasic Kinect示例,以便显示覆盖到视频流的图像。所以我所做的就是加载带有透明背景的图像 (现在是GIF但可能会改变),然后写入显示的位图。
我得到的错误是我写的缓冲区太小了。
我看不出实际的错误是什么(我在XAML / C#/ Kinect中完成了新手),但是WriteableBitmap是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();
}
}
}
}
答案 0 :(得分:2)
你的overlay.Format.BitsPerPixel
/ 8将是1(因为它是一个gif),但你试图将它复制到不是gif的东西,可能是BGRA(32位)。因此,你的尺寸差异很大(4倍)。
.WritePixels
应该接受目标缓冲区的步幅值,但是你超过了叠加层的步幅值(这也会导致奇怪的问题)。
最后,即使它变得100%平滑,你的叠加层实际上也不会“叠加”任何东西,它会替换 - 因为我没有在你的代码中看到任何alpha弯曲数学。
将您的.gif文件切换为.png(32位)并查看是否有帮助。
另外,如果你正在寻找一个AlphaBltMerge类型的代码:我在这里写了整篇文章......这很容易理解。