WriteableBitmap PixelBuffer流长度过小

时间:2012-08-09 14:41:43

标签: c# buffer windows-runtime writeablebitmap

我遇到了一个问题,我正在尝试将一个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;

2 个答案:

答案 0 :(得分:1)

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

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

代码

答案 1 :(得分:1)

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

如何做这样的事情

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