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"
|
||||||
"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
|
||||||
|
|||||||
Reference in new issue
Block a user