How to resize or create a thumbnail image from file stream on UWP

最近在搞Ocr相关的windows universal app, 用到了一些图像处理相关的知识。

涉及到了BitmapDecoder/BitmapEncoder/IRandomAccessStream等类,下面总结了IRandomAccessStream的一些扩展方法,以后还会慢慢加上其他常用的。

 

复制代码
 public static class RandomAccessStreamExtension
    {
        /// <summary>
        /// Retrieves an adjusted thumbnail image with the specified file stream.
        /// </summary>
        /// <param name="inputStream">The input stream.</param>
        /// <param name="requestedSize">The requested size, in pixels.</param>
        /// <returns></returns>
        public static async Task<byte[]> GetThumbnailAsync(this IRandomAccessStream inputStream, uint requestedSize)
        {
            if (inputStream == null)
                return null;

            var decoder = await BitmapDecoder.CreateAsync(inputStream);
            var originalPixelWidth = decoder.PixelWidth;
            var originalPixelHeight = decoder.PixelHeight;
            if (originalPixelWidth < requestedSize || originalPixelHeight < requestedSize)
            {
                return await inputStream.GetBytesAsync();
            }

            using (var outputStream = new InMemoryRandomAccessStream())
            {
                var encoder = await BitmapEncoder.CreateForTranscodingAsync(outputStream, decoder);
                double widthRatio = (double)requestedSize / originalPixelWidth;
                double heightRatio = (double)requestedSize / originalPixelHeight;

                uint aspectHeight = requestedSize;
                uint aspectWidth = requestedSize;

                if (originalPixelWidth > originalPixelHeight)
                {
                    aspectWidth = (uint)(heightRatio * originalPixelWidth);
                }
                else
                {
                    aspectHeight = (uint)(widthRatio * originalPixelHeight);
                }

                encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Linear;
                encoder.BitmapTransform.ScaledHeight = aspectHeight;
                encoder.BitmapTransform.ScaledWidth = aspectWidth;
                await encoder.FlushAsync();

                return await outputStream.GetBytesAsync();
            }
        }

        /// <summary>
        /// Retrieves byte array from the input stream.
        /// </summary>
        /// <param name="stream">The input stream.</param>
        /// <returns></returns>
        public static async Task<byte[]> GetBytesAsync(this IRandomAccessStream stream)
        {
            var bytes = new byte[stream.Size];
            using (var reader = new DataReader(stream.GetInputStreamAt(0)))
            {
                await reader.LoadAsync((uint)stream.Size);
                reader.ReadBytes(bytes);
                return bytes;
            }
        }

        /// <summary>
        /// Retrieves the pixel data.
        /// </summary>
        /// <param name="stream">The input stream.</param>
        /// <returns></returns>
        public static async Task<byte[]> GetPixelDataAsync(this IRandomAccessStream stream)
        {
            var decoder = await BitmapDecoder.CreateAsync(stream);
            var provider = await decoder.GetPixelDataAsync();
            return provider.DetachPixelData();
        }
    }
复制代码

 

Byte array 转 IRandomAccessStream。

下面的两个方法用到了 WindowsRuntimeBufferExtensions 和 WindowsRuntimeStreamExtensions两个类的扩展方法。

需要引用System.Runtime.InteropServices.WindowsRuntime 和 System.IO 命名空间

复制代码
public static IRandomAccessStream AsRandomAccessStream(this byte[] bytes)
        {
            return bytes.AsBuffer().AsStream().AsRandomAccessStream();
        }

public static IRandomAccessStream ConvertToRandomAccessStream(this byte[] bytes)
        {
            var stream = new MemoryStream(bytes);
            return stream.AsRandomAccessStream();
        }
复制代码

 

posted @   supperwu  阅读(293)  评论(0编辑  收藏  举报
编辑推荐:
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· golang自带的死锁检测并非银弹
· 如何做好软件架构师
阅读排行:
· 欧阳的2024年终总结,迷茫,重生与失业
· 聊一聊 C#异步 任务延续的三种底层玩法
· 上位机能不能替代PLC呢?
· 2024年终总结:5000 Star,10w 下载量,这是我交出的开源答卷
· .NET Core:架构、特性和优势详解
点击右上角即可分享
微信分享提示