feat(内存占用): 优化图片缩放性能,降低图片导出内存开销
build.yaml / build (push) Successful in 38s

This commit is contained in:
xiaoqidun committed 2026-09-12 18:05:00 +08:00
1 parent 3b2950a9c1
commit 90bc7b93dc
1 file changed
+22 -1
+22 -1
View File
@@ -24,12 +24,16 @@ import (
"github.com/tdewolff/canvas/renderers" "github.com/tdewolff/canvas/renderers"
"github.com/tdewolff/canvas/renderers/pdf" "github.com/tdewolff/canvas/renderers/pdf"
"github.com/tdewolff/canvas/renderers/rasterizer" "github.com/tdewolff/canvas/renderers/rasterizer"
"golang.org/x/image/draw"
"golang.org/x/image/math/f64"
) )
// rasterRenderer 保留页面物理尺寸的光栅渲染器 // rasterRenderer 保留页面物理尺寸的光栅渲染器
type rasterRenderer struct { type rasterRenderer struct {
*rasterizer.Rasterizer *rasterizer.Rasterizer
width, height float64 width, height float64
dpmm float64
linear bool
} }
// Size 返回页面物理尺寸 // Size 返回页面物理尺寸
@@ -38,6 +42,19 @@ func (r *rasterRenderer) Size() (float64, float64) {
return r.width, r.height return r.width, r.height
} }
// RenderImage 使用底层图片完成平移和缩放
// 入参: img 图片对象, m 图片变换矩阵
func (r *rasterRenderer) RenderImage(img image.Image, m canvas.Matrix) {
if !r.linear || m[0][1] != 0 || m[1][0] != 0 {
r.Rasterizer.RenderImage(img, m)
return
}
origin := m.Dot(canvas.Point{Y: float64(img.Bounds().Dy())}).Mul(r.dpmm)
m = m.Scale(r.dpmm, r.dpmm)
transform := f64.Aff3{m[0][0], -m[0][1], origin.X, -m[1][0], m[1][1], float64(r.Bounds().Dy()) - origin.Y}
draw.CatmullRom.Transform(r.Image, transform, img, img.Bounds(), draw.Over, nil)
}
// RenderToImage 渲染为光栅图 // RenderToImage 渲染为光栅图
// 入参: page 页面内容 // 入参: page 页面内容
// 返回: image.Image 图像对象, error 错误信息 // 返回: image.Image 图像对象, error 错误信息
@@ -47,10 +64,14 @@ func (r *Renderer) RenderToImage(page *PageContent) (image.Image, error) {
return nil, err return nil, err
} }
dpmm := r.DPI / 25.4 dpmm := r.DPI / 25.4
colorSpace := canvas.DefaultColorSpace
_, linear := colorSpace.(canvas.LinearColorSpace)
raster := &rasterRenderer{ raster := &rasterRenderer{
Rasterizer: rasterizer.New(box.W, box.H, canvas.DPMM(dpmm), canvas.DefaultColorSpace), Rasterizer: rasterizer.New(box.W, box.H, canvas.DPMM(dpmm), colorSpace),
width: box.W, width: box.W,
height: box.H, height: box.H,
dpmm: dpmm,
linear: linear,
} }
if err := r.RenderPageToContext(canvas.NewContext(raster), page); err != nil { if err := r.RenderPageToContext(canvas.NewContext(raster), page); err != nil {
return nil, err return nil, err