gpt4 book ai didi

c# - 使用 WriteableBitmap 的缓冲区大小不足?

转载 作者:行者123 更新时间:2023-11-30 16:57:06 27 4
gpt4 key购买 nike

我正在修改 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();
}
}
}
}

最佳答案

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


.WritePixels 应该接受目标缓冲区的步幅值,但您将覆盖层的步幅值传递给它(这也可能导致奇怪的问题)。


最后,即使它 100% 平滑,您的覆盖实际上不会“覆盖”任何东西,它会替换 — 因为我在您的代码中没有看到任何 alpha 弯曲数学。

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

此外,如果您正在寻找 AlphaBltMerge 类型的代码:我在这里写下了整个代码。它非常容易理解。


Merge 2 - 32bit Images with Alpha Channels

关于c# - 使用 WriteableBitmap 的缓冲区大小不足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26999726/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com