Skip to content

Commit 67a6566

Browse files
committed
减少图片文件的重复解码提升性能
1 parent 78d30ad commit 67a6566

3 files changed

Lines changed: 43 additions & 25 deletions

File tree

src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimization.cs

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -78,32 +78,40 @@ public static async Task<ImageFileOptimizationResult> OptimizeImageFileAsync(Fil
7878
};
7979
}
8080

81-
using var _ = image;
82-
83-
if (image.Metadata.DecodedImageFormat is GifFormat)
81+
try
8482
{
85-
return new ImageFileOptimizationResult()
83+
if (image.Metadata.DecodedImageFormat is GifFormat)
8684
{
87-
OptimizedImageFile = null,
88-
FailureReason = ImageFileOptimizationFailureReason.NotSupported
89-
};
90-
}
85+
image.Dispose();
86+
return new ImageFileOptimizationResult()
87+
{
88+
OptimizedImageFile = null,
89+
FailureReason = ImageFileOptimizationFailureReason.NotSupported
90+
};
91+
}
9192

92-
OptimizeImage(image, maxImageWidth, maxImageHeight, useAreaSizeLimit);
93+
OptimizeImage(image, maxImageWidth, maxImageHeight, useAreaSizeLimit);
9394

94-
// 重新保存即可
95-
var outputImageFilePath = Path.Join(workingFolder.FullName, $"{Path.GetRandomFileName()}.png");
96-
await image.SaveAsPngAsync(outputImageFilePath, new PngEncoder()
97-
{
98-
ColorType = PngColorType.RgbWithAlpha,
99-
BitDepth = PngBitDepth.Bit8,
100-
});
95+
// 重新保存即可
96+
var outputImageFilePath = Path.Join(workingFolder.FullName, $"{Path.GetRandomFileName()}.png");
97+
await image.SaveAsPngAsync(outputImageFilePath, new PngEncoder()
98+
{
99+
ColorType = PngColorType.RgbWithAlpha,
100+
BitDepth = PngBitDepth.Bit8,
101+
});
101102

102-
return new ImageFileOptimizationResult()
103+
return new ImageFileOptimizationResult()
104+
{
105+
Image = image,
106+
OptimizedImageFile = new FileInfo(outputImageFilePath),
107+
FailureReason = ImageFileOptimizationFailureReason.Ok
108+
};
109+
}
110+
catch
103111
{
104-
OptimizedImageFile = new FileInfo(outputImageFilePath),
105-
FailureReason = ImageFileOptimizationFailureReason.Ok
106-
};
112+
image.Dispose();
113+
throw;
114+
}
107115
}
108116

109117
/// <summary>

src/MediaConverters/MediaConverters.Lib/Imaging/Optimizations/ImageFileOptimizationResult.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22
using System.Diagnostics.CodeAnalysis;
33
using System.IO;
44

5+
using SixLabors.ImageSharp;
6+
using SixLabors.ImageSharp.PixelFormats;
7+
58
namespace DotNetCampus.MediaConverters.Imaging.Optimizations;
69

710
/// <summary>
811
/// 图片文件优化结果
912
/// </summary>
10-
public readonly record struct ImageFileOptimizationResult()
13+
public readonly record struct ImageFileOptimizationResult() : IDisposable
1114
{
1215
/// <summary>
1316
/// 优化后的图片文件
@@ -17,6 +20,13 @@ public readonly record struct ImageFileOptimizationResult()
1720
public Exception? Exception { get; init; }
1821
public ImageFileOptimizationFailureReason FailureReason { get; init; } = ImageFileOptimizationFailureReason.Ok;
1922

20-
[MemberNotNullWhen(true, nameof(OptimizedImageFile))]
21-
public bool IsSuccess => OptimizedImageFile is not null;
23+
[MemberNotNullWhen(true, nameof(OptimizedImageFile), nameof(Image))]
24+
public bool IsSuccess => OptimizedImageFile is not null && Image is not null;
25+
26+
public Image<Rgba32>? Image { get; init; }
27+
28+
public void Dispose()
29+
{
30+
Image?.Dispose();
31+
}
2232
}

src/MediaConverters/MediaConverters.Tool/Program.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ internal static async Task<ErrorCode> RunAsync(Options options)
3838

3939
var workingFolder = Directory.CreateDirectory(options.WorkingFolder);
4040

41-
var imageFileOptimizationResult = await ImageFileOptimization.OptimizeImageFileAsync(inputFile, workingFolder, imageConvertContext.MaxImageWidth, imageConvertContext.MaxImageHeight, imageConvertContext.UseAreaSizeLimit ?? true);
41+
using var imageFileOptimizationResult = await ImageFileOptimization.OptimizeImageFileAsync(inputFile, workingFolder, imageConvertContext.MaxImageWidth, imageConvertContext.MaxImageHeight, imageConvertContext.UseAreaSizeLimit ?? true);
4242

4343
if (!imageFileOptimizationResult.IsSuccess)
4444
{
@@ -68,7 +68,7 @@ internal static async Task<ErrorCode> RunAsync(Options options)
6868

6969
if (imageConvertContext.ImageConvertTaskList is { } list)
7070
{
71-
using var image = await Image.LoadAsync<Rgba32>(optimizedImageFile.FullName);
71+
var image = imageFileOptimizationResult.Image;
7272
var workerProvider = new WorkerProvider();
7373

7474
foreach (IImageConvertTask imageConvertTask in list)

0 commit comments

Comments
 (0)