mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-30 01:27:26 +08:00
This commit is contained in:
1 parent
3b2950a9c1
commit
90bc7b93dc
1 file changed
+22
-1
@@ -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
|
||||
|
||||
Reference in new issue
Block a user