@@ -13,17 +13,63 @@ namespace DotNetCampus.MediaConverter.SkiaWmfRenderer.Optimizations;
1313/// </summary>
1414public static class EnhancedGraphicsMetafileOptimization
1515{
16+ /// <summary>
17+ /// 尝试将矢量图文件(SVG/WMF/EMF)转换为 PNG 文件
18+ /// </summary>
19+ /// <param name="context"></param>
20+ /// <param name="result"></param>
21+ /// <returns></returns>
22+ public static bool TryOptimizeSvgOrWmf ( EnhancedGraphicsMetafileOptimizationContext context ,
23+ out EnhancedGraphicsMetafileOptimizationResult result )
24+ {
25+ if ( IsExtension ( ".svg" ) )
26+ {
27+ // 如果是 svg 那就直接转换了,因为后续叠加特效等逻辑都不能支持 SVG 格式
28+ try
29+ {
30+ var outputFilePath = SvgFileOptimization . ConvertSvgToPngFile ( in context ) ;
31+ result = new EnhancedGraphicsMetafileOptimizationResult ( )
32+ {
33+ OptimizedImageFile = outputFilePath ,
34+ } ;
35+ }
36+ catch ( Exception e )
37+ {
38+ context . LogMessage ( $ "Convert SVG to PNG failed: { e } ") ;
39+
40+ result = EnhancedGraphicsMetafileOptimizationResult . FailException ( e ) ;
41+ }
42+
43+ return true ;
44+ }
45+ else if ( IsExtension ( ".wmf" ) ||
46+ IsExtension ( ".emf" ) )
47+ {
48+ result = ConvertWmfOrEmfToPngFile ( in context ) ;
49+
50+ return true ;
51+ }
52+
53+ result = default ;
54+ return false ;
55+
56+ bool IsExtension ( string extension )
57+ {
58+ return string . Equals ( context . ImageFile . Extension , extension , StringComparison . OrdinalIgnoreCase ) ;
59+ }
60+ }
61+
1662 /// <summary>
1763 /// 将 WMF 或 EMF 文件转换为 PNG 文件。根据当前运行平台选择合适的转换实现。
1864 /// </summary>
1965 /// <param name="context">包含要转换文件和工作目录等设置的上下文。</param>
2066 /// <returns>转换操作的结果,包含生成的文件或错误信息。</returns>
21- public static EnhancedGraphicsMetafileOptimizationResult ConvertWmfOrEmfToPngFile ( EnhancedGraphicsMetafileOptimizationContext context )
67+ public static EnhancedGraphicsMetafileOptimizationResult ConvertWmfOrEmfToPngFile ( in EnhancedGraphicsMetafileOptimizationContext context )
2268 {
2369 // 在 Windows 上,直接使用 GDI+ 将 WMF 或 EMF 文件转换为 PNG 文件
2470 if ( OperatingSystem . IsWindowsVersionAtLeast ( 6 , 1 ) )
2571 {
26- return ConvertInWindows ( context ) ;
72+ return ConvertInWindows ( in context ) ;
2773 }
2874
2975 if ( OperatingSystem . IsLinux ( ) )
@@ -73,7 +119,7 @@ private static EnhancedGraphicsMetafileOptimizationResult ConvertInLinux(Enhance
73119 }
74120
75121 // 使用 SkiaWmfRenderer 进行转换
76- result = ConvertWithSkiaWmfRenderer ( context ) ;
122+ result = ConvertWithSkiaWmfRenderer ( in context ) ;
77123 if ( result . IsSuccess )
78124 {
79125 return result ;
@@ -86,7 +132,7 @@ private static EnhancedGraphicsMetafileOptimizationResult ConvertInLinux(Enhance
86132
87133 // 使用 libwmf 进行转换
88134
89- result = ConvertWithLibWmf ( context ) ;
135+ result = ConvertWithLibWmf ( in context ) ;
90136 if ( result . OptimizedImageFile is { } svgLibWmfFile )
91137 {
92138 return ConvertSvgToPngFile ( svgLibWmfFile ) ;
@@ -130,7 +176,7 @@ EnhancedGraphicsMetafileOptimizationResult ConvertSvgToPngFile(FileInfo svgImage
130176 /// </summary>
131177 /// <param name="context">包含输入文件、输出目录和尺寸限制等信息的上下文。</param>
132178 /// <returns>如果转换成功则返回包含输出 PNG 文件的结果,否则返回不支持或失败的结果。</returns>
133- private static EnhancedGraphicsMetafileOptimizationResult ConvertWithSkiaWmfRenderer ( EnhancedGraphicsMetafileOptimizationContext context )
179+ private static EnhancedGraphicsMetafileOptimizationResult ConvertWithSkiaWmfRenderer ( in EnhancedGraphicsMetafileOptimizationContext context )
134180 {
135181 int requestWidth = context . MaxImageWidth ?? 0 ;
136182 int requestHeight = context . MaxImageHeight ?? 0 ;
@@ -162,7 +208,7 @@ private static EnhancedGraphicsMetafileOptimizationResult ConvertWithSkiaWmfRend
162208 }
163209
164210 [ SupportedOSPlatform ( "linux" ) ]
165- private static EnhancedGraphicsMetafileOptimizationResult ConvertWithLibWmf ( EnhancedGraphicsMetafileOptimizationContext context )
211+ private static EnhancedGraphicsMetafileOptimizationResult ConvertWithLibWmf ( in EnhancedGraphicsMetafileOptimizationContext context )
166212 {
167213 var file = context . ImageFile ;
168214 var workingFolder = context . WorkingFolder ;
@@ -297,7 +343,7 @@ private static EnhancedGraphicsMetafileOptimizationResult ConvertWithInkscape(En
297343 }
298344
299345 [ SupportedOSPlatform ( "windows6.1" ) ]
300- private static EnhancedGraphicsMetafileOptimizationResult ConvertInWindows ( EnhancedGraphicsMetafileOptimizationContext context )
346+ private static EnhancedGraphicsMetafileOptimizationResult ConvertInWindows ( in EnhancedGraphicsMetafileOptimizationContext context )
301347 {
302348 var file = context . ImageFile ;
303349 var workingFolder = context . WorkingFolder ;
0 commit comments