Skip to content

Commit 8f70cd9

Browse files
committed
尝试提供缩放计算逻辑
1 parent 6940982 commit 8f70cd9

2 files changed

Lines changed: 92 additions & 8 deletions

File tree

Workbench/Wmf/SkiaWmfRenderer/samples/sample/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
var outputFolder = Path.Join(AppContext.BaseDirectory, $"Output_{Path.GetRandomFileName()}");
1717
Directory.CreateDirectory(outputFolder);
1818

19-
var testFile = @"C:\lindexi\wmf公式\image64.wmf";
19+
var testFile = @"C:\lindexi\wmf公式\sample.wmf";
2020
ConvertImageFile(testFile);
2121

2222
//var folder = @"C:\lindexi\wmf公式\";

Workbench/Wmf/SkiaWmfRenderer/src/SkiaWmfRenderer/Rendering/WmfRenderer.cs

Lines changed: 91 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)