★ 5 stars↓ 64 downloadsUpdated 13d agoMIT
Obsidian 图片标签插件
这是一个功能丰富的 Obsidian 插件,提供图片标签管理和图库视图功能。
功能特性
- 图片标签管理:为图片添加自定义标签,方便分类和检索
- 图库视图:可视化展示所有图片,支持网格布局
- 图片信息面板:在侧边栏查看和编辑图片的详细信息
- 搜索和过滤:通过标签或关键词快速查找图片
- 批量扫描:自动扫描库中的所有图片文件
- 页面图片提取:从当前页面提取所有图片并添加到标签系统
- SQLite 存储:使用 SQLite 数据库存储媒体信息,减少频繁 JSON 全量读写
- MD5 标识:以文件内容 MD5 作为记录 ID,重命名不会改变标签和描述
构建说明
插件已成功构建,生成的文件包括:
main.js- 插件的主要 JavaScript 代码styles.css- 插件的样式文件manifest.json- 插件的元数据信息
安装方法
-
将以下文件复制到您的 Obsidian 库的
.obsidian/plugins/目录下:main.jsstyles.cssmanifest.json
-
在 Obsidian 设置中启用插件
使用方法
-
启用插件后,您可以通过命令面板 (
Ctrl/Cmd+P) 访问以下功能:- "打开图片图库" - 打开可视化图库视图
- "打开图片信息面板" - 打开侧边栏图片信息面板
- "扫描库中的所有图片" - 扫描并索引库中的所有图片
- "从当前页面提取图片" - 从当前页面提取图片并添加到标签系统
-
在图库视图中,您可以:
- 浏览所有图片
- 按标签、标题或描述搜索图片
- 查看图片详细信息
- 添加或编辑标签
-
当打开图片文件时,图片信息面板会自动显示该图片的详细信息,您可以编辑标题、描述和标签。
配置选项
- 旧 JSON 数据路径:仅用于首次升级时定位旧版本数据
- 支持的图片格式:自定义插件处理的图片文件格式
- 导入时自动添加标签:当新图片添加到库中时是否自动创建标签数据项
- 扫描指定文件夹:通过文件夹选择器挑选需要扫描的文件夹,可添加多个;未添加任何文件夹时扫描整个库
平台支持
插件同时支持 Obsidian 桌面端与移动端(Android / iOS):
- 数据存储使用
sql.js的 asm.js 构建(.obsidian/image-tags.db),不依赖桌面端原生模块,移动端同样可用 - 文件内容指纹使用纯 TypeScript 实现的 MD5,不依赖 Node 的
crypto/Buffer - 「导出 JSON」在桌面端会弹出系统「另存为」对话框;移动端会写入库内文件
- 「导入 JSON」在桌面端会弹出系统「打开文件」对话框;移动端会从库内选择 JSON 文件
- 「用默认软件打开」为桌面端专属功能,移动端不显示该行为
数据迁移
当前版本将数据保存到 .obsidian/image-tags.db,插件首次启动时会自动读取设置中的旧 JSON 路径以及常见旧路径。迁移成功并完成 SQLite 写入后,旧 JSON 文件会被删除;迁移失败时不会删除源文件。
媒体记录的 ID 是文件内容的 MD5。文件重命名时 ID 保持不变;文件内容发生变化时,插件按原路径继承标签、标题和描述等数据,并为新内容生成新的 MD5 ID。
启动性能
- 插件启用时不再同步等待设置读取,界面先完成渲染,设置随后异步合并生效
sql.js初始化与数据库读取推迟到布局就绪后的浏览器空闲时机执行- 仅注册一份
contextmenu委托监听器,避免重复菜单与多余的启动开销
技术架构
此插件使用以下组件:
- 图片数据模型 (image-data-model.ts) - 管理图片元数据
- 图片信息视图 (image-info-view.ts) - 侧边栏信息面板
- 图库视图 (gallery-view.ts) - 主要的图库界面
- 选择器模态框 (suggest-modals.ts) - 文件夹 / 库内文件选择器,桌面端与移动端通用
- 平台工具 (platform.ts) - 收口桌面端与移动端的能力差异(Electron、fs、路径)
- 纯 TS MD5 (md5.ts) - 不依赖 Node 运行时计算文件内容指纹
- 样式文件 (styles.css) - 定制化界面样式
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.