【问题标题】:WriteableBitmap PixelBuffer Stream Length Too SmallWriteableBitmap PixelBuffer 流长度太小
【发布时间】:2012-08-09 14:41:42
【问题描述】:

我遇到了一个问题,我试图将一个 WriteableBitmap 的像素缓冲区复制到另一个 WriteableBitmap,实际上是提供了一个 WriteableBitmap 对象的副本。但是,当我尝试这样做时,我遇到了第二个 WriteableBitmap 的流长度太短而无法容纳第一个 WriteableBitmap 的所有值的问题。 我在下面发布了我的代码。请记住,我正在从网络摄像头捕获原始数据。但是,当我将“ps”对象的流大小与 wb1 和 wb2 进行比较时,ps 的大小比它们都小得多。我感到困惑的是为什么 wb2 流大小小于 wb1。感谢您的帮助。

private MemoryStream originalStream = new MemoryStream();
WriteableBitmap wb1 = new WriteableBitmap((int)photoBox.Width, (int)photoBox.Height);
WriteableBitmap wb2 = new WriteableBitmap((int)photoBox.Width, (int)photoBox.Height);

ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg();
var ps = new InMemoryRandomAccessStream();

await mc.CapturePhotoToStreamAsync(imageProperties, ps);
await ps.FlushAsync();

ps.Seek(0);

wb1.SetSource(ps);
(wb1.PixelBuffer.AsStream()).CopyTo(originalStream); // this works

originalStream.Position = 0;
originalStream.CopyTo(wb2.PixelBuffer.AsStream()); // this line gives me the error: "Unable to expand length of this stream beyond its capacity"

Image img = new Image(); 
img.Source = wb2; // my hope is to treat this as it's own entity and modify this image independently of wb1 or originalStream

photoBox.Source =wb1;

【问题讨论】:

    标签: c# buffer windows-runtime writeablebitmap


    【解决方案1】:

    请注意,当您执行 new WriteableBitmap(w, h) 然后调用 SetSource() 到不同分辨率的图像时 - 位图的大小会改变(它不会是构造函数中传递的 w x h)。您的 photoBox.Width/Height 可能与您的 CapturePhotoToStreamAsync() 调用返回的不同(我假设图像是在默认或预配置的相机设置下捕获的,而 photoBox 只是屏幕上的一个控件)。

    做这样的事情怎么样

    ps.Seek(0);
    wb1.SetSource(ps);
    ps.Seek(0);
    wb2.SetSource(ps);
    

    【讨论】:

    • 哇,我不敢相信它这么容易。我有一种感觉,我以后可能会在使用 ps 时遇到内存管理问题,但这是我的应用程序的问题,而不是您的解决方案。感谢您指出明显的 Filip!
    • Filip,我遇到了 XamlToolkit。 WritableBitmapRenderExtension.Render(image);给出“无法将此流的长度扩展到其容量之外”。我刚刚以编程方式创建了一个 XAML 图像并使用此方法渲染它并给了我这个错误。你能帮我解决这个问题吗?
    • 抱歉,该 API 不再受支持。请改用RenderTargetBitmap
    【解决方案2】:

    我认为您应该从 PixelBuffer 创建一个写入器并使用它来复制流。 AsStream 方法应该用于读取缓冲区,而不是写入。

    看看 http://social.msdn.microsoft.com/Forums/en-NZ/winappswithcsharp/thread/2b499ac5-8bc8-4259-a144-842bd756bfe2

    一段代码

    【讨论】:

    • 这不是 CopyTo 方法正在做的事情,因为 AsStream() 不只是获取 PixelBuffer 并返回一个 IBuffer 对象吗?还有你说的是哪个 PixelBuffer?
    猜你喜欢
    • 2021-11-06
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多