mybase插件之插入每日照片

nealian 2020-03-31 PM 1804℃ 0条

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对象,得到setCanvasSizedrawImagesaveAs三个方法名,因此先设置画布至欲缩放的大小,然后将原照片画上去,另存为新图片后将路径传入上述的createFile方法即可;问题在于

    • 三个方法的部分参数含义没有试出来
    • CLocalFile没有给出查看图片文件宽高信息的方法,而等比例压缩需要图片宽高信息
  • mybase自带插件中搜索上述三个方法,得到各方法其参数含义
  • 搜索jpg文件头格式,得知以0xffc0开始的SOF0段第6、7个字节为图像高,第8、9个字节为图像宽,大端序(jpg文件格式分析

    • 根据mybase插件API文档,CLocalFIle提供了readBytes方法, CByteArray对象,调用其at方法可以获得单个字节值
  • 按上述方法有时无法得到图片正确的宽高信息,用二进制编辑器打开图片搜索0xffc0,发现有两处,经搜索得知第一处为Exif中的缩略图信息,获得的宽高也是缩略图的宽高

    • 缩略图的宽高比例与真实宽高比例一致,在等比压缩时不影响
    • 插件中通过判断宽高是否超过某值来决定是否进行压缩,缩略图宽高通常比较少,导致判断均为不压缩
  • Exif段第5、6个字节为该段的大小,跳过该段,从该数量之后的字节开始寻找0xffc0即可
  • 至此,问题解决
总结
问题解决
变化的路径寻找不变
未知的方法参数提问、搜索
对jpg文件格式的错误认识搜索

附:插件源代码

标签: none

非特殊说明,本博所有文章均为博主原创。

评论啦~