/// <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; }