创建新的最有效(最简单)的方法是什么?Windows.Graphics.Imaging.SoftwareBitmap
具有区域副本的对象(BitmapBounds
例如)另一个SoftwareBitmap
对象(深拷贝),适用于 Windows UWP 应用程序?
没有这样的构造函数或静态方法SoftwareBitmap
。所有 Copy* 方法都会复制整个位图。
我玩过WriteableBitmap
为了达成这个:
SoftwareBitmap CreateFromBitmap(SoftwareBitmap bmp, Rect rect)
{
WriteableBitmap wbmpIn = new WriteableBitmap(bmp.PixelWidth, bmp.PixelHeight);
bmp.CopyToBuffer(wbmpIn.PixelBuffer);
WriteableBitmap wbmpOut = new WriteableBitmap((int)rect.Width, (int)rect.Height);
wbmpOut.Blit(new Rect(0, 0, rect.Width, rect.Height), wbmpIn, rect);
SoftwareBitmap ret = new SoftwareBitmap(bmp.BitmapPixelFormat, (int)rect.Width, (int)rect.Height);
ret.CopyFromBuffer(wbmpOut.PixelBuffer);
return ret;
}
但它看起来并不有效——涉及两个 CopyFromBuffer() 和一个 Blit()。
有更有效的解决方案吗?
您可以参考以下代码,它可以从现有的SoftwareBitmap创建一个新的裁剪SoftwareBitmap。
private async Task<SoftwareBitmap> CreateFromBitmap(SoftwareBitmap softwareBitmap, Rect rect)
{
using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
{
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, stream);
encoder.SetSoftwareBitmap(softwareBitmap);
encoder.BitmapTransform.Bounds = new BitmapBounds()
{
X = (uint)rect.X,
Y = (uint)rect.Y,
Height = (uint)rect.Height,
Width = (uint)rect.Width
};
await encoder.FlushAsync();
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
return await decoder.GetSoftwareBitmapAsync(softwareBitmap.BitmapPixelFormat, softwareBitmap.BitmapAlphaMode);
}
}
var croppedBitmap = await CreateFromBitmap(sourceSoftwareBmp, new Rect(0, 0, 200, 100));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)