Skip to content

Supports previewing HEIF/HEIC images#16748

Open
TCOTC wants to merge 6 commits intosiyuan-note:devfrom
TCOTC:feat/heif
Open

Supports previewing HEIF/HEIC images#16748
TCOTC wants to merge 6 commits intosiyuan-note:devfrom
TCOTC:feat/heif

Conversation

@TCOTC
Copy link
Copy Markdown
Contributor

@TCOTC TCOTC commented Dec 31, 2025

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
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")) // 旧版的缩略图目录
Copy link
Copy Markdown
Contributor Author

@TCOTC TCOTC Jan 16, 2026

Choose a reason for hiding this comment

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

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

@TCOTC
Copy link
Copy Markdown
Contributor Author

TCOTC commented Feb 10, 2026

PixPin_2026-02-10_21-16-57

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant