コード例 #1
0
        /// <summary>
        /// 提供图片转码
        /// </summary>
        /// <param name="SourceFile">源文件</param>
        /// <param name="DestinationFile">目标文件</param>
        /// <param name="IsEnableScale">是否启用缩放</param>
        /// <param name="ScaleWidth">缩放宽度</param>
        /// <param name="ScaleHeight">缩放高度</param>
        /// <param name="InterpolationMode">插值模式</param>
        /// <returns></returns>
        public static async Task TranscodeFromImageAsync(FileSystemStorageItemBase SourceFile, FileSystemStorageItemBase DestinationFile, bool IsEnableScale = false, uint ScaleWidth = default, uint ScaleHeight = default, BitmapInterpolationMode InterpolationMode = default)
        {
            IsAnyTransformTaskRunning = true;

            using (IRandomAccessStream OriginStream = await SourceFile.GetRandomAccessStreamFromFileAsync(FileAccessMode.Read).ConfigureAwait(false))
            {
                try
                {
                    BitmapDecoder Decoder = await BitmapDecoder.CreateAsync(OriginStream);

                    using (SoftwareBitmap TranscodeImage = await Decoder.GetSoftwareBitmapAsync())
                        using (IRandomAccessStream TargetStream = await DestinationFile.GetRandomAccessStreamFromFileAsync(FileAccessMode.ReadWrite).ConfigureAwait(false))
                        {
                            BitmapEncoder Encoder = DestinationFile.Type.ToLower() switch
                            {
                                ".png" => await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, TargetStream),
                                ".jpg" => await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, TargetStream),
                                ".bmp" => await BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, TargetStream),
                                ".heic" => await BitmapEncoder.CreateAsync(BitmapEncoder.HeifEncoderId, TargetStream),
                                ".tiff" => await BitmapEncoder.CreateAsync(BitmapEncoder.TiffEncoderId, TargetStream),
                                _ => throw new InvalidOperationException("Unsupport image format"),
                            };

                            if (IsEnableScale)
                            {
                                Encoder.BitmapTransform.ScaledWidth       = ScaleWidth;
                                Encoder.BitmapTransform.ScaledHeight      = ScaleHeight;
                                Encoder.BitmapTransform.InterpolationMode = InterpolationMode;
                            }

                            Encoder.SetSoftwareBitmap(TranscodeImage);

                            await Encoder.FlushAsync();
                        }
                }
                catch (Exception)
                {
                    DestinationFile.PermanentDelete();

                    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() =>
                    {
                        QueueContentDialog dialog = new QueueContentDialog
                        {
                            Title           = Globalization.GetString("Common_Dialog_ErrorTitle"),
                            Content         = Globalization.GetString("EnDecode_Dialog_Content"),
                            CloseButtonText = Globalization.GetString("Common_Dialog_CloseButton")
                        };

                        _ = await dialog.ShowAsync().ConfigureAwait(true);
                    });
                }
            }

            IsAnyTransformTaskRunning = false;
        }