如何裁剪矩形的软件位图 - UWP

Posted

技术标签:

【中文标题】如何裁剪矩形的软件位图 - UWP【英文标题】:How to crop a software bitmap in rectangular shape - UWP 【发布时间】:2017-10-11 06:05:39 【问题描述】:

我正在从正在运行的视频中捕获一帧并将其转换为 SoftwareBitmap 以供进一步使用。在此之前,我想将该框架裁剪为矩形。怎么可能?

        var thumbnail = await GetThumbnailAsync(file,seek_position);
        StringBuilder ocr=null;
        InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream();
        await RandomAccessStream.CopyAsync(thumbnail, randomAccessStream);
        randomAccessStream.Seek(0);      
        SoftwareBitmap inputBitmap;
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(randomAccessStream);
        // Get the SoftwareBitmap representation of the file
        inputBitmap = await decoder.GetSoftwareBitmapAsync();
       //crop inputBitmap

  public async Task<IInputStream> GetThumbnailAsync(StorageFile file,int i)
    
        //int duration_millisecond = i * 1000;
        var mediaClip = await MediaClip.CreateFromFileAsync(file);
        var mediaComposition = new MediaComposition();
        mediaComposition.Clips.Add(mediaClip);
        return await mediaComposition.GetThumbnailAsync(
        TimeSpan.FromMilliseconds(i), 0, 0, VideoFramePrecision.NearestFrame);
    

【问题讨论】:

【参考方案1】:

BitmapDecoder 对象的GetSoftwareBitmapAsync 方法有几个重载方法。您可以使用GetSoftwareBitmapAsync(BitmapPixelFormat, BitmapAlphaMode, BitmapTransform, ExifOrientationMode, ColorManagementMode) 方法来裁剪软件位图。您只需为其定义一个 BitmapTransform 对象。

请参考以下代码示例:

SoftwareBitmap inputBitmap;
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(randomAccessStream);
// Get the SoftwareBitmap representation of the file
inputBitmap = await decoder.GetSoftwareBitmapAsync(decoder.BitmapPixelFormat,BitmapAlphaMode.Ignore,new BitmapTransform() Bounds=new BitmapBounds() X=100,Y=200,Width=200,Height=100  ,ExifOrientationMode.IgnoreExifOrientation,ColorManagementMode.DoNotColorManage);

您只需为其 Bounds 属性指定一个新的BitmapBounds

请注意,在这一步,你已经得到了一个裁剪的软件位图,但是如果你想用它来初始化一个SoftwareBitmapSource 并让它显示在Image 控件中。您将收到异常“SetBitmapAsync 仅支持具有正宽度/高度、bgra8 像素格式和预乘或无 alpha 的 SoftwareBitmap。”。您需要使用SoftwareBitmap _softbitmap = SoftwareBitmap.Convert() 制作一个新的软件位图,如下所示:

SoftwareBitmap _softbitmap = SoftwareBitmap.Convert(inputBitmap,BitmapPixelFormat.Bgra8,BitmapAlphaMode.Premultiplied);
var source = new SoftwareBitmapSource();
await source.SetBitmapAsync(_softbitmap);
image.Source = source; //image is a Image control

【讨论】:

以上是关于如何裁剪矩形的软件位图 - UWP的主要内容,如果未能解决你的问题,请参考以下文章

如何裁剪矩形区域? [关闭]

以矩形裁剪位图图像

在位图上制作可调整的裁剪矩形

使用矩形尺寸裁剪图像

在 Android 中基于叠加层裁剪位图 - Camera API 2

如何裁剪位图并获得图像的下 50%