mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-30 01:27:26 +08:00
1 parent
1739303f5e
commit
c577af31eb
4 files changed
+41
-20
No files matched your search
@@ -9,7 +9,7 @@ require (
|
|||||||
github.com/tdewolff/canvas v0.0.0-20260923214215-09804640d00c
|
github.com/tdewolff/canvas v0.0.0-20260923214215-09804640d00c
|
||||||
github.com/tdewolff/font v0.0.0-20260913163313-54f98bb59ee6
|
github.com/tdewolff/font v0.0.0-20260913163313-54f98bb59ee6
|
||||||
github.com/xiaoqidun/jbig2 v1.1.1
|
github.com/xiaoqidun/jbig2 v1.1.1
|
||||||
github.com/xiaoqidun/pdfgo v0.0.0-20260927111518-3299b44c9705
|
github.com/xiaoqidun/pdfgo v0.0.0-20260927114248-f2deafc71b89
|
||||||
golang.org/x/crypto v0.57.0
|
golang.org/x/crypto v0.57.0
|
||||||
golang.org/x/image v0.46.0
|
golang.org/x/image v0.46.0
|
||||||
golang.org/x/text v0.42.0
|
golang.org/x/text v0.42.0
|
||||||
|
|||||||
@@ -62,8 +62,8 @@ github.com/tdewolff/test v1.0.12 h1:7F21DqIajswxuche0geHdrUZRCWE4oko4b7bcmkkrxk=
|
|||||||
github.com/tdewolff/test v1.0.12/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8=
|
github.com/tdewolff/test v1.0.12/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8=
|
||||||
github.com/xiaoqidun/jbig2 v1.1.1 h1:SjliS9ZO0e9HX5oYUfBuXrfFsXhWricrSz+XY4zORDI=
|
github.com/xiaoqidun/jbig2 v1.1.1 h1:SjliS9ZO0e9HX5oYUfBuXrfFsXhWricrSz+XY4zORDI=
|
||||||
github.com/xiaoqidun/jbig2 v1.1.1/go.mod h1:8QonVWtENmh2kc6l+leqeGl7psb79DWlHDkCpdChjfQ=
|
github.com/xiaoqidun/jbig2 v1.1.1/go.mod h1:8QonVWtENmh2kc6l+leqeGl7psb79DWlHDkCpdChjfQ=
|
||||||
github.com/xiaoqidun/pdfgo v0.0.0-20260927111518-3299b44c9705 h1:DgUrxq3/Mn3218rwv3Daw1FHcbmR0E3aOIsa6VZMMNQ=
|
github.com/xiaoqidun/pdfgo v0.0.0-20260927114248-f2deafc71b89 h1:pdnJkITNBORnYyoqU0u9MDHpjwnALvkiBS8cdJFRTRg=
|
||||||
github.com/xiaoqidun/pdfgo v0.0.0-20260927111518-3299b44c9705/go.mod h1:4Pf0JO0BEf1uzRY+uZjlMjN/OPn3PYa0YMi6cqPPTLQ=
|
github.com/xiaoqidun/pdfgo v0.0.0-20260927114248-f2deafc71b89/go.mod h1:4Pf0JO0BEf1uzRY+uZjlMjN/OPn3PYa0YMi6cqPPTLQ=
|
||||||
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
|
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
|
||||||
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
|
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
|
||||||
github.com/yuin/goldmark v1.8.5 h1:r6N5afV5qj/5S4UTch8agZHJ8UxNCMwX7WjkkJam2NA=
|
github.com/yuin/goldmark v1.8.5 h1:r6N5afV5qj/5S4UTch8agZHJ8UxNCMwX7WjkkJam2NA=
|
||||||
|
|||||||
+14
-16
@@ -330,27 +330,25 @@ func imageNRGBAAt(img image.Image, x, y int) color.NRGBA {
|
|||||||
// 返回: color.NRGBA 颜色, bool 是否存在
|
// 返回: color.NRGBA 颜色, bool 是否存在
|
||||||
func transparentEdgeColor(img *image.NRGBA, x, y int) (color.NRGBA, bool) {
|
func transparentEdgeColor(img *image.NRGBA, x, y int) (color.NRGBA, bool) {
|
||||||
bounds := img.Bounds()
|
bounds := img.Bounds()
|
||||||
var best color.NRGBA
|
best, alpha := 0, uint8(0)
|
||||||
for dy := -1; dy <= 1; dy++ {
|
left, right := max(x-1, bounds.Min.X), min(x+2, bounds.Max.X)
|
||||||
for dx := -1; dx <= 1; dx++ {
|
scan:
|
||||||
if dx == 0 && dy == 0 {
|
for ny := max(y-1, bounds.Min.Y); ny < min(y+2, bounds.Max.Y); ny++ {
|
||||||
continue
|
offset := img.PixOffset(left, ny)
|
||||||
}
|
for nx := left; nx < right; nx++ {
|
||||||
nx, ny := x+dx, y+dy
|
if (nx != x || ny != y) && img.Pix[offset+3] > alpha {
|
||||||
if nx < bounds.Min.X || nx >= bounds.Max.X || ny < bounds.Min.Y || ny >= bounds.Max.Y {
|
best, alpha = offset, img.Pix[offset+3]
|
||||||
continue
|
if alpha == 255 {
|
||||||
}
|
break scan
|
||||||
c := img.NRGBAAt(nx, ny)
|
}
|
||||||
if c.A > best.A {
|
|
||||||
best = c
|
|
||||||
}
|
}
|
||||||
|
offset += 4
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if best.A == 0 {
|
if alpha == 0 {
|
||||||
return color.NRGBA{}, false
|
return color.NRGBA{}, false
|
||||||
}
|
}
|
||||||
best.A = 1
|
return color.NRGBA{R: img.Pix[best], G: img.Pix[best+1], B: img.Pix[best+2], A: 1}, true
|
||||||
return best, true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// transparentPaddingColor 获取透明补齐颜色
|
// transparentPaddingColor 获取透明补齐颜色
|
||||||
|
|||||||
+24
-1
@@ -16,6 +16,7 @@ package ofdgo
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"image"
|
"image"
|
||||||
|
"math"
|
||||||
|
|
||||||
"golang.org/x/image/draw"
|
"golang.org/x/image/draw"
|
||||||
"golang.org/x/image/math/f64"
|
"golang.org/x/image/math/f64"
|
||||||
@@ -43,13 +44,35 @@ func drawRasterImageCommand(backend RasterBackend, page *RasterPage, dst draw.Im
|
|||||||
if mask.Rect.Empty() {
|
if mask.Rect.Empty() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
bounds := mask.Rect.Intersect(dst.Bounds())
|
bounds := mask.Rect.Intersect(dst.Bounds()).Intersect(rasterImageBounds(src.Bounds(), m, dst.Bounds()))
|
||||||
|
if bounds.Empty() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
layer := image.NewRGBA64(bounds)
|
layer := image.NewRGBA64(bounds)
|
||||||
draw.CatmullRom.Transform(layer, f64.Aff3{m[0], m[2], m[4], m[1], m[3], m[5]}, imagePixelSource(src), src.Bounds(), draw.Src, nil)
|
draw.CatmullRom.Transform(layer, f64.Aff3{m[0], m[2], m[4], m[1], m[3], m[5]}, imagePixelSource(src), src.Bounds(), draw.Src, nil)
|
||||||
draw.DrawMask(dst, bounds, layer, bounds.Min, mask, bounds.Min, draw.Over)
|
draw.DrawMask(dst, bounds, layer, bounds.Min, mask, bounds.Min, draw.Over)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rasterImageBounds 计算采样器可能写入的像素范围,并在整数转换前裁至目标边界
|
||||||
|
// 入参: source 原始像素边界, m 像素变换, target 目标边界
|
||||||
|
// 返回: image.Rectangle 受影响的目标像素区域
|
||||||
|
func rasterImageBounds(source image.Rectangle, m RasterMatrix, target image.Rectangle) image.Rectangle {
|
||||||
|
minX, minY, maxX, maxY := math.Inf(1), math.Inf(1), math.Inf(-1), math.Inf(-1)
|
||||||
|
for _, p := range [4]image.Point{source.Min, {X: source.Max.X, Y: source.Min.Y}, {X: source.Min.X, Y: source.Max.Y}, source.Max} {
|
||||||
|
x := math.Floor(float64(m[0]*float64(p.X)) + float64(m[2]*float64(p.Y)) + m[4])
|
||||||
|
y := math.Floor(float64(m[1]*float64(p.X)) + float64(m[3]*float64(p.Y)) + m[5])
|
||||||
|
minX, minY = math.Min(minX, x), math.Min(minY, y)
|
||||||
|
maxX, maxY = math.Max(maxX, x+1), math.Max(maxY, y+1)
|
||||||
|
}
|
||||||
|
minX, minY = math.Max(minX, float64(target.Min.X)), math.Max(minY, float64(target.Min.Y))
|
||||||
|
maxX, maxY = math.Min(maxX, float64(target.Max.X)), math.Min(maxY, float64(target.Max.Y))
|
||||||
|
if minX >= maxX || minY >= maxY {
|
||||||
|
return image.Rectangle{}
|
||||||
|
}
|
||||||
|
return image.Rect(int(minX), int(minY), int(maxX), int(maxY))
|
||||||
|
}
|
||||||
|
|
||||||
// PixelTransform 将页面毫米变换转换为像素变换,保留尺寸取整后的原点位置
|
// PixelTransform 将页面毫米变换转换为像素变换,保留尺寸取整后的原点位置
|
||||||
// 入参: m 局部到页面变换, height 目标像素高度
|
// 入参: m 局部到页面变换, height 目标像素高度
|
||||||
// 返回: RasterMatrix 局部到像素变换
|
// 返回: RasterMatrix 局部到像素变换
|
||||||
|
|||||||
Reference in new issue
Block a user