Supports previewing HEIF/HEIC images by TCOTC · Pull Request #16748 · siyuan-note/siyuan
Conversation
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.Map和sync.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
changed the title
支持预览 HEIF/HEIC 图片
Supports previewing HEIF/HEIC images
| 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.
确定要合并了再按前两条的格式补充版本号、解决冲突
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
