Supports previewing HEIF/HEIC images by TCOTC · Pull Request #16748 · siyuan-note/siyuan

Conversation

@TCOTC

Note

经过在 Xcode 的模拟器上测试,在修复 #16747 之前,清理缓存图片的逻辑在 iOS 上不生效。安卓和鸿蒙应该也是一样的。

Note

因为我搞不定在模拟器里安装 Chrome,不清楚 iOS 上的非 Safari 浏览器能不能查看 HEIF 图片。所以代码实现是只有 Safari 浏览器和 iOS APP 能直接查看。

AI 总结:

支持预览 HEIF/HEIC 图片

功能概述

实现了对 HEIF/HEIC 图片格式的完整支持。原始文件保持不变,系统在预览时按需进行格式转换和缩略图生成,确保所有客户端都能正常显示图片。

实现内容

1. 前端支持

  • 在图片格式列表中添加了 .heic.heif 扩展名支持
  • 更新了图片压缩 URL 处理逻辑,支持 HEIF/HEIC 格式的缩略图请求
  • 添加了必要的依赖包配置

2. 后端处理逻辑

  • 按需转换服务:实现了 serveHeifConversion 函数,当客户端不支持 HEIF 格式时,动态将 HEIF 图片转换为 JPEG 格式返回
  • 按需缩略图服务:实现了 serveHeifThumbnail 函数,生成 HEIF 图片的缩略图
  • 客户端支持检测:实现了 isHeifSupported 函数,用于检测客户端是否原生支持 HEIF 格式
    • iOS 应用的 WKWebView 和 Safari 浏览器支持 HEIF,直接返回原始文件
    • 其他客户端(如 Electron)不支持,转换为 JPEG 返回
  • 缓存机制:使用文件哈希值作为缓存键,转换后的文件缓存在临时目录,避免重复转换
  • 重构优化:重构了缩略图服务逻辑,统一了普通图片和 HEIF 图片的处理流程

3. 核心转换功能

  • HEIF 转 JPEG:实现了 ConvertHeifToJpeg 函数,将 HEIF 文件转换为 JPEG 格式(保持原始尺寸)
  • HEIF 缩略图生成:实现了 GenerateHeifThumbnail 函数,生成 HEIF 图片的缩略图(最大宽度 520px)
  • EXIF 方向处理:实现了 fixImageOrientation 函数,根据 EXIF 方向信息自动修正图片方向
  • 并发控制:使用 sync.Mapsync.Once 实现并发控制,避免同一文件被重复转换
  • 缓存管理:重构了缓存清理逻辑,统一管理普通图片和 HEIF 图片的缓存文件

技术细节

  • 使用 github.com/jdeng/goheif 库进行 HEIF 图片解码
  • 使用 github.com/rwcarlsen/goexif 库处理 EXIF 方向信息
  • 转换后的 JPEG 文件质量设置为 85
  • 缩略图最大宽度固定为 520px,按比例缩放
  • 缓存文件存储在 temp/assets-cache/ 目录下,分为 heif/thumb/ 两个子目录

兼容性

  • 原生支持:iOS 应用和 Safari 浏览器可以直接显示 HEIF 图片,无需转换
  • 按需转换:其他客户端(如 Electron、Chrome 等)在预览时自动将 HEIF 转换为 JPEG 格式显示
  • 向后兼容:不影响现有图片格式的处理逻辑

原始设计文档:流程设计.md

参考资料:

@TCOTC TCOTC changed the title 支持预览 HEIF/HEIC 图片 Supports previewing HEIF/HEIC images

Jan 2, 2026

TCOTC

os.RemoveAll(filepath.Join(util.TempDir, "blocktree.msgpack")) // v2.7.2 前旧版的块树数据
os.RemoveAll(filepath.Join(util.DataDir, "%")) // v3.0.6 生成的错误历史文件夹
os.RemoveAll(filepath.Join(util.TempDir, "blocktree")) // v3.1.0 前旧版的块树数据
os.RemoveAll(filepath.Join(util.TempDir, "thumbnails")) // 旧版的缩略图目录

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

确定要合并了再按前两条的格式补充版本号、解决冲突

@TCOTC

PixPin_2026-02-10_21-16-57

1 participant

@TCOTC