diff --git a/go.mod b/go.mod index cd85dcb..8591713 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/tdewolff/font v0.0.0-20261010204837-88a7f6b56918 github.com/xiaoqidun/j2kgo v1.0.1 github.com/xiaoqidun/jbig2 v1.1.7 - github.com/xiaoqidun/pdfgo v0.0.0-20261015080813-04cab548eee1 + github.com/xiaoqidun/pdfgo v0.0.0-20261015084227-8b2c590c8095 golang.org/x/crypto v0.58.0 golang.org/x/image v0.47.0 golang.org/x/text v0.43.0 diff --git a/go.sum b/go.sum index c6aa328..afff885 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/xiaoqidun/j2kgo v1.0.1 h1:W0SytzjvgiOhXwq+JNRSVKLB847fjGOvGWTNKqmwvo0 github.com/xiaoqidun/j2kgo v1.0.1/go.mod h1:DCwAfuDzCDYqUiAlZ7BDwigTjaXw7o9L1FtEma/D1aA= github.com/xiaoqidun/jbig2 v1.1.7 h1:118d2lQn2ZsupmXazK+2p23Jp5xQ09btBmPUoYoa/+Y= github.com/xiaoqidun/jbig2 v1.1.7/go.mod h1:9jromqVwMqlptUDEt6Yip8vqYA5I1YjhG7FgMl/Z2dA= -github.com/xiaoqidun/pdfgo v0.0.0-20261015080813-04cab548eee1 h1:j0HPne+OoMJt3moQyurnlWfMsVd0SyCmEl/epSOIpG4= -github.com/xiaoqidun/pdfgo v0.0.0-20261015080813-04cab548eee1/go.mod h1:FUQ8+TfNoec6tZCdsckx+rrD25JACm7EzuZyFH37QHg= +github.com/xiaoqidun/pdfgo v0.0.0-20261015084227-8b2c590c8095 h1:lkK0xbGXJIKvH9zgKtf94HiGt35krCmy8EESPUCxRFE= +github.com/xiaoqidun/pdfgo v0.0.0-20261015084227-8b2c590c8095/go.mod h1:FUQ8+TfNoec6tZCdsckx+rrD25JACm7EzuZyFH37QHg= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yuin/goldmark v1.8.5 h1:r6N5afV5qj/5S4UTch8agZHJ8UxNCMwX7WjkkJam2NA= diff --git a/internal/base/image/scale.go b/internal/base/image/scale.go index 4267953..7d48e90 100644 --- a/internal/base/image/scale.go +++ b/internal/base/image/scale.go @@ -265,9 +265,27 @@ func DrawPixels(dst draw.Image, src image.Image, m [6]float64, op draw.Op) { if drawRasterAxisImage(dst, src, m, op) { return } + src = rasterTransformSource(src, TransformBounds(b, m, dst.Bounds())) draw.CatmullRom.Transform(dst, f64.Aff3{m[0], m[2], m[4], m[1], m[3], m[5]}, src, b, op, nil) } +// rasterTransformSource 为放大的通用图像缓存十六位预乘像素,限制临时缓冲大小 +// 入参: src 源图像, affected 目标采样区域 +// 返回: image.Image 等值采样图像 +func rasterTransformSource(src image.Image, affected image.Rectangle) image.Image { + switch src.(type) { + case *image.RGBA, *image.RGBA64: + return src + } + b := src.Bounds() + if b.Empty() || affected.Empty() || b.Dx() > rasterScaleBufferLimit/8/b.Dy() || float64(affected.Dx())*float64(affected.Dy()) < float64(b.Dx())*float64(b.Dy()) { + return src + } + pixels := image.NewRGBA64(b) + draw.Draw(pixels, b, src, b.Min, draw.Src) + return pixels +} + // rasterScaleBounds 检查变换是否可无几何取整地使用缩放器,并限制其中间缓冲 // 入参: b 源边界, m 像素变换 // 返回: image.Rectangle 缩放边界, bool 是否适用