我有一个WritableBitmap是从网络摄像头的快照创建的。我想将它加载到BitmapDecoder中,以便我可以裁剪图像。这是代码:
IRandomAccessStream ras = displaySource.PixelBuffer.AsStream().AsRandomAccessStream();
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(ras); //Fails Here
displaySource是来自网络摄像头的WritableBitmap,我得到的例外是
{"找不到该组件。 (HRESULT异常:0x88982F50)"}
这对我来说很奇怪,因为我可以将displaySource加载到我的GUI上,我只是无法使用此代码。我也试过将它切换到InMemoryRandomAccessStream。从我看到的这个例外中没有任何stackoverflow解决方案。
displaySource是从以下代码生成的:
// Create a WritableBitmap for our visualization display; copy the original bitmap pixels to wb's buffer.
// Note that WriteableBitmap doesn't support NV12 and we have to convert it to 32-bit BGRA.
using (SoftwareBitmap convertedSource = SoftwareBitmap.Convert(previewFrame.SoftwareBitmap, BitmapPixelFormat.Bgra8))
{
displaySource = new WriteableBitmap(convertedSource.PixelWidth, convertedSource.PixelHeight);
convertedSource.CopyToBuffer(displaySource.PixelBuffer);
}
预览帧是网络摄像头的VideoFrame设置。
提前致谢。
答案 0 :(得分:2)
WriteableBitmap.PixelBuffer已经被解码为BGRA像素的缓冲区。
BitmapDecoder需要解码图像(.bmp,.png,.jpg等)并生成像素缓冲区。 BitmapEncoder采用像素缓冲区并生成编码图像。
您可以通过调用BitmapEncoder来编码为.png(不使用jpg等有损格式)然后使用BitmapDecoder进行解码来进行往返。如果你的目标是保存裁剪的图像,那么只需使用BitmapEncoder。这两个类都可以应用BitmapTransform。
如果你想做的只是裁剪,那么通过位图格式进行往返是过度的。只需从PixelArray中复制出你想要的像素就很容易了。如果您不想自己编写,开源库WriteableBitmapEx提供了对WriteableBitmap的扩展,并具有Crop方法:
// Crops the WriteableBitmap to a region starting at P1(5, 8) and 10px wide and 10px high
var cropped = writeableBmp.Crop(5, 8, 10, 10);