From 90bc7b93dc6f4aec6a828b9bbacf7980672d5869 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Sat, 12 Sep 2026 18:05:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=86=85=E5=AD=98=E5=8D=A0=E7=94=A8):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=9B=BE=E7=89=87=E7=BC=A9=E6=94=BE=E6=80=A7?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E9=99=8D=E4=BD=8E=E5=9B=BE=E7=89=87=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=86=85=E5=AD=98=E5=BC=80=E9=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_renderer_output.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/ofdgo_renderer_output.go b/ofdgo_renderer_output.go index 41e62f3..2a9661b 100644 --- a/ofdgo_renderer_output.go +++ b/ofdgo_renderer_output.go @@ -24,12 +24,16 @@ import ( "github.com/tdewolff/canvas/renderers" "github.com/tdewolff/canvas/renderers/pdf" "github.com/tdewolff/canvas/renderers/rasterizer" + "golang.org/x/image/draw" + "golang.org/x/image/math/f64" ) // rasterRenderer 保留页面物理尺寸的光栅渲染器 type rasterRenderer struct { *rasterizer.Rasterizer width, height float64 + dpmm float64 + linear bool } // Size 返回页面物理尺寸 @@ -38,6 +42,19 @@ func (r *rasterRenderer) Size() (float64, float64) { 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 渲染为光栅图 // 入参: page 页面内容 // 返回: image.Image 图像对象, error 错误信息 @@ -47,10 +64,14 @@ func (r *Renderer) RenderToImage(page *PageContent) (image.Image, error) { return nil, err } dpmm := r.DPI / 25.4 + colorSpace := canvas.DefaultColorSpace + _, linear := colorSpace.(canvas.LinearColorSpace) 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, height: box.H, + dpmm: dpmm, + linear: linear, } if err := r.RenderPageToContext(canvas.NewContext(raster), page); err != nil { return nil, err