From 03048750e08155210236368492e1f63fcd5fc752 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Sun, 13 Sep 2026 17:19:47 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BC=98=E5=8C=96=E6=80=A7=E8=83=BD):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AD=97=E4=BD=93=E5=A4=8D=E7=94=A8=E4=B8=8E?= =?UTF-8?q?JPEG=E5=AF=BC=E5=87=BA=EF=BC=8C=E7=B2=BE=E7=AE=80=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/webui/webui.go | 23 ++++++++++++++++++----- ofdgo_renderer_output.go | 13 ++++++++++--- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/internal/webui/webui.go b/internal/webui/webui.go index 255bb62..80374f0 100644 --- a/internal/webui/webui.go +++ b/internal/webui/webui.go @@ -18,7 +18,6 @@ import ( "bytes" "fmt" "image" - "image/color" "image/draw" "image/jpeg" "image/png" @@ -476,7 +475,7 @@ func (s *Session) ExportPage(index int, value string, dpi float64) ([]byte, Expo if renderErr != nil { return nil, ExportFormat{}, renderErr } - err = jpeg.Encode(&buf, imageWithWhiteBackground(img), &jpeg.Options{Quality: 95}) + err = jpeg.Encode(&buf, fillWhiteBackground(img), &jpeg.Options{Quality: 95}) } if err != nil { return nil, ExportFormat{}, err @@ -667,13 +666,27 @@ func (s *Session) ExportPDF() ([]byte, error) { return buf.Bytes(), nil } -// imageWithWhiteBackground 填充图片白色背景 +// fillWhiteBackground 填充白色背景,复用当前导出图片的RGBA像素 // 入参: img 图片对象 // 返回: image.Image 图片对象 -func imageWithWhiteBackground(img image.Image) image.Image { +func fillWhiteBackground(img image.Image) image.Image { bounds := img.Bounds() + if rgba, ok := img.(*image.RGBA); ok { + for y := 0; y < bounds.Dy(); y++ { + row := rgba.Pix[y*rgba.Stride : y*rgba.Stride+bounds.Dx()*4] + for i := 0; i < len(row); i += 4 { + if alpha := 255 - row[i+3]; alpha != 0 { + row[i] += alpha + row[i+1] += alpha + row[i+2] += alpha + row[i+3] = 255 + } + } + } + return rgba + } dst := image.NewRGBA(bounds) - draw.Draw(dst, bounds, &image.Uniform{C: color.White}, image.Point{}, draw.Src) + draw.Draw(dst, bounds, image.White, image.Point{}, draw.Src) draw.Draw(dst, bounds, img, bounds.Min, draw.Over) return dst } diff --git a/ofdgo_renderer_output.go b/ofdgo_renderer_output.go index 2a9661b..42caf8e 100644 --- a/ofdgo_renderer_output.go +++ b/ofdgo_renderer_output.go @@ -21,9 +21,10 @@ import ( "io" "github.com/tdewolff/canvas" - "github.com/tdewolff/canvas/renderers" "github.com/tdewolff/canvas/renderers/pdf" + "github.com/tdewolff/canvas/renderers/ps" "github.com/tdewolff/canvas/renderers/rasterizer" + "github.com/tdewolff/canvas/renderers/svg" "golang.org/x/image/draw" "golang.org/x/image/math/f64" ) @@ -88,7 +89,9 @@ func (r *Renderer) RenderToSVG(page *PageContent, writer io.Writer) error { if err != nil { return err } - return c.Write(writer, renderers.SVG()) + renderer := svg.New(writer, c.W, c.H, nil) + c.RenderTo(renderer) + return renderer.Close() } // replacePDFProducer 替换PDF的Producer属性 @@ -125,7 +128,11 @@ func (r *Renderer) RenderToEPS(page *PageContent, writer io.Writer) error { if err != nil { return err } - return c.Write(writer, renderers.EPS()) + options := ps.DefaultOptions + options.Format = ps.EncapsulatedPostScript + renderer := ps.New(writer, c.W, c.H, &options) + c.RenderTo(renderer) + return renderer.Close() } // RenderToMultiPagePDF 将整个文档导出为多页PDF