1

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

2 回答 2

1

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

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

对于一段代码

于 2012-08-09T14:44:52.377 回答
1

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

做这样的事情怎么样

ps.Seek(0);
wb1.SetSource(ps);
ps.Seek(0);
wb2.SetSource(ps);
于 2012-08-09T18:50:27.923 回答