C# 如何从另一个软件位图(UWP)的区域创建软件位图

C# 如何从另一个软件位图(UWP)的区域创建软件位图,c#,windows,uwp,windows-10-universal,windows-10-iot-core,C#,Windows,Uwp,Windows 10 Universal,Windows 10 Iot Core,为Windows UWP应用程序创建一个新的Windows.Graphics.Imaging.SoftwareBitmap对象以及另一个SoftwareBitmap对象(深度副本)的区域副本(BitmapBounds)最有效(最简单)的方法是什么 软件位图没有这样的构造函数或静态方法。所有Copy*方法复制整个位图 我玩了WriteableBitmap来实现这一点: SoftwareBitmap CreateFromBitmap(SoftwareBitmap bmp, Rect rect

为Windows UWP应用程序创建一个新的
Windows.Graphics.Imaging.SoftwareBitmap
对象以及另一个
SoftwareBitmap
对象(深度副本)的区域副本(
BitmapBounds
)最有效(最简单)的方法是什么

软件位图
没有这样的构造函数或静态方法。所有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()


有更有效的解决方案吗?

您可以参考以下代码,它可以从现有的软件位图创建新的裁剪软件位图

    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));
专用异步任务CreateFromBitmap(软件位图软件位图,Rect Rect)
{
使用(InMemoryRandomAccessStream=新建InMemoryRandomAccessStream())
{
BitmapEncoder编码器=等待BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId,流);
编码器。设置软件EBITMAP(软件位图);
encoder.BitmapTransform.Bounds=新的BitmapBounds()
{
X=(uint)rect.X,
Y=(uint)rect.Y,
高度=(uint)垂直高度,
宽度=(uint)rect.Width
};
等待编码器。FlushAsync();
BitmapDecoder decoder=等待BitmapDecoder.CreateAsync(流);
返回wait decoder.GetSoftwareBitmapAsync(softwareBitmap.BitmapPixelFormat,softwareBitmap.BitmapAlphaMode);
}
}
var crappedbitmap=await createfrombmap(sourceSoftwareBmp,new Rect(0,0,200,100));