myBase Desktop 是一款用于分类存储管理任意格式资料的小型个人数据库软件, 有助于个人用户在(Linux/MacOSX/Windows)桌面电脑系统上实施文档、知识、笔记、日记、图片和网页的分类存储和管理。 借助软件提供的各项功能,创建和维护一个专属于自己的个人知识库将变的相对简单快捷。
在使用mybase写日记的时候,时常需要从手机添加当日所拍摄的照片作为附件,写一个插件完成此操作将方便许多。
添加图片到附件
- 利用
CNyfDb
类的createFile
方法将本地文件作为附件复制到mybase中,参数是待插入附件条目的路径(mybase使用类似文件系统的方式管理每个条目)以及本地某文件的路径,问题变成了获得当前打开条目的路径,以及要插入的图片的路径 - 利用
CNyfDb
类的getCurItemInfo
方法可以获得当前条目的路径 - 在linux系统中,手机通过usb(MTP)连接电脑后,照片目录为
/run/user/1000/gvfs/mtp:host=%5Busb%3A001%2C008%5D/内部存储设备/DCIM/Camera
,利用CLocalDir
以及CLocalFile
类的相关方法遍历图片文件,比对日期,获得当日拍摄图片的路径,问题在于每次连接电脑mtp:host=xxx
目录的名称是变化的,内部存储设备
也因手机系统不同而不同 - 在电脑只连接一个手机时,在
gvfs
目录下mtp:host=xxx
这一个目录,因此列出gvfs
下所有目录,除去.
和..
,第3项便是;同理可进入内部存储目录 - 至此,问题解决
如今使用手机拍摄的照片文件通常比较大,一方面容易造成数据库文件快速增大,另一方面实际上并不需要这么高的分辨率,因此可以先将照片压缩(按比例缩小尺寸)再添加为附件。
在添加到附件前压缩图片
- 搜索
js压缩图片
,得知可以使用canvas
达到压缩目的(js压缩图片) mybase
提供了一个CCanvas
类,与html中的canvas
类似,只是相关文档不全,于是- 发邮件向优秀的开发者索取文档(第二天收到回复说暂未提供该文档,相关使用方法参考软件自带的插件代码)
- 遍历一个CCanvas对象,查看其所有方法
通过遍历CCanvas对象,得到
setCanvasSize
,drawImage
,saveAs
三个方法名,因此先设置画布至欲缩放的大小,然后将原照片画上去,另存为新图片后将路径传入上述的createFile
方法即可;问题在于- 三个方法的部分参数含义没有试出来
CLocalFile
没有给出查看图片文件宽高信息的方法,而等比例压缩需要图片宽高信息
- 在
mybase
自带插件中搜索上述三个方法,得到各方法其参数含义 搜索
jpg文件头格式
,得知以0xffc0开始的SOF0段第6、7个字节为图像高,第8、9个字节为图像宽,大端序(jpg文件格式分析)- 根据
mybase
插件API文档,CLocalFIle
提供了readBytes
方法,CByteArray
对象,调用其at
方法可以获得单个字节值
- 根据
按上述方法有时无法得到图片正确的宽高信息,用二进制编辑器打开图片搜索
0xffc0
,发现有两处,经搜索得知第一处为Exif中的缩略图信息,获得的宽高也是缩略图的宽高- 缩略图的宽高比例与真实宽高比例一致,在等比压缩时不影响
- 插件中通过判断宽高是否超过某值来决定是否进行压缩,缩略图宽高通常比较少,导致判断均为不压缩
- Exif段第5、6个字节为该段的大小,跳过该段,从该数量之后的字节开始寻找
0xffc0
即可 - 至此,问题解决
总结
问题 | 解决 |
---|---|
变化的路径 | 寻找不变 |
未知的方法参数 | 提问、搜索 |
对jpg文件格式的错误认识 | 搜索 |
附:插件源代码