我遇到了一个问题,我正在尝试将一个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;
答案 0 :(得分:1)
我认为您应该从PixelBuffer创建一个写入器并使用它来复制流。 应该使用AsStream方法来读取缓冲区,而不是写入缓冲区。
代码
答案 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);