@@ -13,17 +13,22 @@ class WmfRenderer
1313 public required int RequestWidth { get ; init ; }
1414 public required int RequestHeight { get ; init ; }
1515
16+ /// <summary>
17+ /// 图片压缩的最大宽度
18+ /// </summary>
19+ private const int MaxWidth = 3840 ;
20+
21+ /// <summary>
22+ /// 图片压缩的最大高度
23+ /// </summary>
24+ private const int MaxHeight = 2160 ;
25+
1626 public bool TryRender ( [ NotNullWhen ( true ) ] out SKBitmap ? skBitmap )
1727 {
1828 skBitmap = null ;
1929
2030 var format = WmfDocument . Format ;
2131
22- if ( format . Left > format . Right || format . Top > format . Bottom )
23- {
24- return false ;
25- }
26-
2732 var x = Math . Min ( format . Left , format . Right ) ;
2833 var y = Math . Min ( format . Top , format . Bottom ) ;
2934
@@ -38,10 +43,11 @@ public bool TryRender([NotNullWhen(true)] out SKBitmap? skBitmap)
3843 Height = height
3944 } ;
4045
46+ var ( bitmap , skCanvas ) = CreateSKBitmapAndSKCanvas ( ) ;
4147
42- skBitmap = new SKBitmap ( width , height , SKColorType . Bgra8888 , SKAlphaType . Premul ) ;
48+ skBitmap = bitmap ;
4349
44- using SKCanvas canvas = new SKCanvas ( skBitmap ) ;
50+ using SKCanvas canvas = skCanvas ;
4551
4652 try
4753 {
@@ -64,6 +70,84 @@ public bool TryRender([NotNullWhen(true)] out SKBitmap? skBitmap)
6470 }
6571 }
6672
73+ private ( SKBitmap Bitmap , SKCanvas Canvas ) CreateSKBitmapAndSKCanvas ( )
74+ {
75+ var format = WmfDocument . Format ;
76+ var offsetX = format . Right > format . Left
77+ ? - format . Left
78+ : - format . Right ;
79+ var offsetY = format . Bottom > format . Top
80+ ? - format . Top
81+ : - format . Bottom ;
82+
83+ var width = Math . Abs ( format . Right - format . Left ) ;
84+ var height = Math . Abs ( format . Bottom - format . Top ) ;
85+
86+ var renderWidth = width ;
87+ var renderHeight = height ;
88+
89+ var requestWidth = RequestWidth ;
90+ if ( requestWidth == 0 )
91+ {
92+ if ( renderWidth > MaxWidth )
93+ {
94+ // 约束宽度为最大宽度
95+ var sx = MaxWidth / ( float ) renderWidth ;
96+ renderWidth = MaxWidth ;
97+ renderHeight = ( int ) Math . Round ( renderHeight * sx ) ;
98+ }
99+ else
100+ {
101+ // 保持不动
102+ }
103+ }
104+ else
105+ {
106+ var sx = requestWidth / ( float ) renderWidth ;
107+ renderWidth = requestWidth ;
108+ renderHeight = ( int ) Math . Round ( renderHeight * sx ) ;
109+ }
110+
111+ var requestHeight = RequestHeight ;
112+ if ( requestHeight == 0 )
113+ {
114+ if ( renderHeight > MaxHeight )
115+ {
116+ var sy = MaxHeight / ( float ) renderHeight ;
117+ renderHeight = MaxHeight ;
118+ renderWidth = ( int ) Math . Round ( renderWidth * sy ) ;
119+ }
120+ else
121+ {
122+ // 保持不动
123+ }
124+ }
125+ else
126+ {
127+ if ( requestWidth != 0 && renderHeight <= requestHeight )
128+ {
129+ // 如果已经有宽度约束了,且高度没有超过要求的高度,则不需要缩放高度
130+ }
131+ else
132+ {
133+ var sy = requestHeight / ( float ) renderHeight ;
134+ renderHeight = requestHeight ;
135+ renderWidth = ( int ) Math . Round ( renderWidth * sy ) ;
136+ }
137+ }
138+
139+ var scaleX = ( float ) renderWidth / width ;
140+ var scaleY = ( float ) renderHeight / height ;
141+
142+ var skBitmap = new SKBitmap ( renderWidth , renderHeight , SKColorType . Bgra8888 , SKAlphaType . Premul ) ;
143+
144+ SKCanvas canvas = new SKCanvas ( skBitmap ) ;
145+ canvas . Translate ( offsetX , offsetY ) ;
146+ canvas . Scale ( scaleX , scaleY ) ;
147+
148+ return ( skBitmap , canvas ) ;
149+ }
150+
67151 private bool TryRenderInner ( SKCanvas canvas , WmfRenderStatus renderStatus )
68152 {
69153 for ( var i = 0 ; i < WmfDocument . Records . Count ; i ++ )
0 commit comments