如何在WinRT中生成图像的自定义缩略图图像?寻找类似于StorageFile.GetThumbnailAsync的算法

时间:2016-06-10 06:42:01

标签: c# windows-runtime windows-phone-8.1 windows-10 winrt-async

当我尝试访问应用程序本地存储中的文件缩略图时(由于访问问题),我遇到了一个问题。解决方法建议:

1.将文件复制到公共目录

2.get thumbnail image

3.从公共目录中删除文件

很有帮助,但是当需要几个文件的缩略图时很慢。

关于WinRt的thumnail生成api如何工作的任何想法(算法)都会有所帮助。

1 个答案:

答案 0 :(得分:0)

此任务应该从图像文件创建5倍小的缩略图文件:

        private async Task SaveImageAsync(StorageFile inputFile, StorageFile outputFile)
    {
            Guid encoderId = BitmapEncoder.JpegEncoderId;

            using (IRandomAccessStream inputStream = await inputFile.OpenAsync(FileAccessMode.Read),
                       outputStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                outputStream.Size = 0;

                BitmapDecoder decoder = await BitmapDecoder.CreateAsync(inputStream);
                BitmapTransform transform = new BitmapTransform();

                double scalefactor = 0.2;  // 5 times smaller

                transform.ScaledHeight = (uint)(decoder.PixelHeight * scalefactor);
                transform.ScaledWidth = (uint)(decoder.PixelWidth * scalefactor);

                transform.InterpolationMode = BitmapInterpolationMode.Fant;

                BitmapPixelFormat format = decoder.BitmapPixelFormat;
                BitmapAlphaMode alpha = decoder.BitmapAlphaMode;

                PixelDataProvider pixelProvider = await decoder.GetPixelDataAsync(format, alpha, transform,
                    ExifOrientationMode.RespectExifOrientation, ColorManagementMode.ColorManageToSRgb);

                byte[] pixels = pixelProvider.DetachPixelData();

                BitmapEncoder encoder = await BitmapEncoder.CreateAsync(encoderId, outputStream);
                encoder.SetPixelData(
                    format,
                    alpha,
                    (uint)((double)decoder.PixelWidth * scalefactor),
                    (uint)((double)decoder.PixelHeight * scalefactor),
                    decoder.DpiX,
                    decoder.DpiY,
                    pixels
                    );

                await encoder.FlushAsync();
            }
    }