perf(性能优化): 优化资源读写与字体图像处理
build.yaml / build (push) Successful in 9m22s

This commit is contained in:
xiaoqidun committed 2026-10-14 08:22:31 +08:00
1 parent 21bd592358
commit bec13d523f
47 files changed
+1455 -539

No files matched your search

+29 -19
View File
@@ -42,9 +42,16 @@ type ImagePageOptions struct {
OnProgress func(stage string, completed, total int) error
}
// editorImagePageInfo 保存同批次已校验图片的建页信息,不持有编码、像素或颜色模型
type editorImagePageInfo struct {
size image.Point
format string
metadata baseimage.PageInfo
}
// ImportImages 将PNG、JPEG、BMP、单页TIFF或JBIG2逐张建页并插入指定位置,一次操作计入一条撤销记录
// 保留像素及透明度,方向通过对象变换实现,不重新采样;图片压缩沿用AddImage规则
// 同一批次的相同图片复用解码校验结果,不额外保留像素数据
// 同一批次的相同图片复用解码校验及元数据,不额外保留像素数据
// 失败或取消时不修改文档,读取期间仍需容纳单张图片的解码数据
// 入参: ctx 取消上下文, sources 按页面顺序排列的图片, at 插入位置, options 建页选项
// 返回: error 错误信息
@@ -82,7 +89,7 @@ func (e *Editor) ImportImages(ctx context.Context, sources []ImagePageSource, at
}
return e.Transaction(func(e *Editor) error {
indexes := make([]int, 0, len(sources))
verified := make(map[[32]byte]bool)
verified := make(map[[32]byte]editorImagePageInfo)
for i, source := range sources {
if err := ctx.Err(); err != nil {
return err
@@ -111,33 +118,36 @@ func (e *Editor) ImportImages(ctx context.Context, sources []ImagePageSource, at
}
// addImagePage 保留原图并按方向、物理尺寸与纸张选项建页
// 入参: ctx 取消上下文, data 图片数据, options 建页选项, verified 本批次已成功解码的图片摘要
// 入参: ctx 取消上下文, data 图片数据, options 建页选项, verified 本批次已校验图片的建页信息
// 返回: int 从0开始的页面索引, error 错误信息
func (e *Editor) addImagePage(ctx context.Context, data []byte, options ImagePageOptions, verified map[[32]byte]bool) (int, error) {
func (e *Editor) addImagePage(ctx context.Context, data []byte, options ImagePageOptions, verified map[[32]byte]editorImagePageInfo) (int, error) {
if err := ctx.Err(); err != nil {
return 0, err
}
config, format, err := baseimage.DecodeConfigDataContext(ctx, data)
if err != nil {
return 0, err
}
if format != "png" && format != "jpeg" && format != "bmp" && format != "tiff" && format != "jbig2" {
return 0, fmt.Errorf("only PNG, JPEG, BMP, single-page TIFF and JBIG2 images are supported")
}
var decoded image.Image
checksum := sha256.Sum256(data)
if !verified[checksum] {
info, known := verified[checksum]
if !known {
config, format, err := baseimage.DecodeConfigDataContext(ctx, data)
if err != nil {
return 0, err
}
if format != "png" && format != "jpeg" && format != "bmp" && format != "tiff" && format != "jbig2" {
return 0, fmt.Errorf("only PNG, JPEG, BMP, single-page TIFF and JBIG2 images are supported")
}
decoded, _, err = baseimage.DecodePixelsContext(ctx, data)
if err != nil {
return 0, err
}
verified[checksum] = true
metadata, err := baseimage.PageMetadataContext(ctx, data, format, options.DPI)
if err != nil {
return 0, err
}
info = editorImagePageInfo{size: image.Pt(config.Width, config.Height), format: format, metadata: metadata}
verified[checksum] = info
}
metadata, err := baseimage.PageMetadataContext(ctx, data, format, options.DPI)
if err != nil {
return 0, err
}
w, h := float64(config.Width)*25.4/metadata.XDPI, float64(config.Height)*25.4/metadata.YDPI
metadata := info.metadata
w, h := float64(info.size.X)*25.4/metadata.XDPI, float64(info.size.Y)*25.4/metadata.YDPI
if metadata.Orientation >= 5 {
w, h = h, w
}
@@ -154,7 +164,7 @@ func (e *Editor) addImagePage(ctx context.Context, data []byte, options ImagePag
if err := ctx.Err(); err != nil {
return 0, err
}
resource, err := e.addImage(data, config, format, decoded)
resource, err := e.addImage(ctx, data, info.size, info.format, decoded, checksum)
if err != nil {
return 0, err
}