QuickLook缩略图数据解析器
今年早些时候,应读者请求,我编写了一个解析QuickLook缩略图index.sqlite文件的工具。这个SQLite数据库存储了系统上生成的缩略图相关信息,包括文件名、路径、时间戳等(详见我之前的博客文章)。该文件位于/private/var/folders/<random>/<random>/C/com.apple.QuickLook.thumbnailcache目录下。
最近有人联系我,询问同一文件夹中的thumbnails.data文件,该文件包含实际的缩略图。他们在从该文件中提取图像时遇到了问题。
研究
我用十六进制查看器打开了Mac上的thumbnails.data文件并滚动查看。在滚动过程中,我没有注意到任何典型的图像文件头。以下是我看到的截图:
通常,我期望在十六进制视图中看到类似以下内容:
这里红色显示的文件头是PNG文件的。我还尝试查找了其他各种图像的文件头,如jpg、gif和bmp,但都没有成功。
我将com.apple.QuickLook.thumbnailcache文件夹放在已擦除的SD卡上,并使用几个提取程序尝试从thumbnails.data文件中提取图像。虽然提取程序能够提取出SQLite数据库,但它们没有找到任何图像。
有趣。我开始进行一些研究,在这篇博客文章中找到了一个参考,指出图像以"原始位图"形式存储。“原始位图"与.bmp文件不同。原始位图没有文件头或文件尾,没有外部信息无法解码。根据这个网站,典型原始位图具有以下特征:
- 无文件头或文件尾
- 未压缩
- 不使用调色板
- 没有外部信息无法解码,例如:
- 颜色类型和采样顺序(RGB、BGR、灰度等)
- 图像宽度(像素)
- 行填充逻辑
- 字节顺序和/或位顺序
这解释了我使用的文件提取程序为何无法提取图像。文件提取程序需要文件头来识别和提取文件。那么,如果没有文件头,我们如何提取这些图像?幸运的是,QuickLook index.sqlite表存储了提取thumbnails.data文件中图像所需的"外部"信息。
这些外部信息包括位图在文件中的位置、位图长度、宽度和高度。
手动提取
以下是从数据库中提取的数据示例。对于此示例,文件file3251255366828.jpg实际上有两个关联的缩略图:一个是64×64,另一个是更大的164×164:
我将逐步介绍如何使用QuickLook index.sqlite数据库中的信息手动提取64×64缩略图。虽然我编写了一个解析器来自动化这些步骤(在下面进一步介绍),但我认为了解如何手动操作是很好的,这样可以验证您可能使用的任何工具,或者在工具不起作用时进行操作。
首先使用FTK Imager打开thumbnails.data文件,选择"文件” > “添加证据项” > “文件夹内容”。要转到文件偏移量,选择文件,在十六进制区域右键单击,然后选择"转到偏移量…"。我们需要的偏移量是thumbnails表中bitmapdata_location字段的值,993284:
FTK将带我们到文件偏移量。完成此操作后,我们需要选择接下来的16384字节 - thumbnails表中bitmapdata_length字段的值。为此,我们可以右键单击并选择"设置选择长度":
然后填写thumbnails表中bitmapdata_length字段的值:
完成此操作后,我们可以将选择保存到名为"image.data"的文件中:
现在我们已经将位图保存到文件中 - 我们该如何处理它?请记住,它没有文件头,因此仅将其重命名为.jpg或.png是行不通的。那么如何查看它?Gimp - 一个免费的图片编辑程序,能够打开原始位图,并让您提供宽度、高度和图像类型的选项。
使用Gimp的"文件" > “打开"并选择原始图像数据类型。打开image.data文件会出现以下对话框:
注意图像看起来很奇怪?这是因为我们必须指定正确的值来渲染图像。图像类型是RGB Alpha(这是我通过尝试确定的),宽度和高度是64(来自thumbnails表的宽度和高度字段)。输入这些值后,图像正确显示:
脚本
谁想为每个图像手动执行此操作?像往常一样,Python来救援。对于这个特定的脚本,我使用了一个名为Tkinter的Python库。这个库让我能够构建一个在多个平台上运行的GUI应用程序!多么酷啊?该脚本也可以在命令行中使用。
要使用GUI,只需无命令启动Python脚本:
为了证明它有效,以下是同一脚本在Linux和Mac上工作的截图(在Ubuntu 14.4和Mac OSX上测试):
使用GUI非常简单 - 选择包含com.apple.QuickLook.thumbnailcache的文件夹,以及一个将保存脚本输出的文件夹。脚本将生成文件报告并创建一个包含图像的子文件夹。Excel选项将生成一个嵌入了图像的Excel电子表格。
TSV输出的命令行语法如下:
|
|
Excel输出的命令行语法如下:
|
|
为了使用该脚本,需要安装biplist和Pillow库。biplist是一个用于二进制plist文件的Python库,Pillow用于处理图像。这两个库都很容易安装。
要安装biplist,使用easy_install:
- Linux/Mac:
sudo easy_install biplist - Windows:
C:\<PYTHONDIR>\scripts\easy_install.exe biplist
要安装Pillow:
- Linux/Mac:
sudo pip install Pillow - Windows:
C:\<PYTHONDIR>\scripts\pip.exe install Pillow
默认输出是TSV,但是,如果您想要Excel报告,需要安装xlswriter Python库:
- Linux/Mac:
easy_install xlswriter - Windows:
C:\<PYTHONDIR>\scripts\easy_install.exe xlswriter
如果您不想安装所有库,我还包含了一个编译的Windows可执行文件。
下载quicklook解析器