RAW格式图片缩略图生成调研
一、背景
希望支持众多RAW格式图片的缩略图提取。由于相机市场上有各种品牌厂商,各家都有自己RAW格式,并没有一个统一的标准,每家厂商也不公开自己的格式标准,因此解码这些RAW片的软件都由各厂商自己提供,属于私有软件,因此对这些非标准协议的格式转码提取缩略图就比较困难。
二、方案调研
ImageMagick提供了一系列的图片处理工具,一般生成缩略图等都会基于ImageMagick实现,所以首先调研ImageMagick能都支持RAW格式图片的处理。
ImageMagick本事不支持RAW格式图片的处理,需要通过安装UFRaw来扩展支持,ImageMagick安装了UFRaw后就可以支持基本大部分RAW格式图片的处理了。
但是UFRaw的编译依赖太多,尤其依赖高版本的gtk+和glib导致在低版本centos上编译运行比较困难(目前线上环境都还是CentOS4.3 gtk和glib最新版本是2.4和2.0),而且UFRaw转码再生成缩略图的速度比较慢,不满足线上实时生成缩略图。
调研发现UFRaw等支持RAW格式图片的处理的软件基本都是通过dcraw来做RAW格式图片解码的,dcraw是以为非常牛的大神写的一款比较简单的开源工具,基本没有依赖,可以支持RAW格式图片的读取已经缩略图提取和转码为tiff格式等。
另外,大部分的RAW格式图片都包含了一张jpeg格式的缩略图的,所以只需要通过dcraw提取出这张jpeg格式的缩略图然后对其做resize生成指定格式的缩略图即可。
三、dcraw介绍
dcraw(读作”dee-see-raw”)是一款可以支持各种RAW片的完全符合UNIX哲学的开源软件,它能把相机拍的RAW片转换成PPM或者TIFF格式的图片。这类软件通常用叫做RAW转换软件,或者叫做RAW片显影软件(RAW developer),adobe camera raw就是这类软件;UFRaw也是,不过它真正解RAW用的代码还是dcraw。RAW到PPM,TIFF这类图片转换的过程称作RAW显影,对应胶片显影的概念,RAW片也可以被看作是一种数字底片。 dcraw只有一个纯C文件dcraw.c,最新版的代码有9400行左右,作者是Dave Coffin,项目主页在这里 http://www.cybercom.net/~dcoffin/dcraw/ ,可以下载最新的代码,查看支持的机型,以及FAQ列表。dcraw更新的很快,基本上新上市的相机都会被马上支持,咱刚入的650D就是支持的(Canon EOS 650D/EOS Rebel T4i/EOS Kiss X6i UFRaw 显示问题)。
相机市场上有各种品牌厂商,各家都有自己RAW格式,并没有一个统一的标准,每家厂商也不公开自己的格式标准,因此解码这些RAW片的软件都由各厂商自己提供,属于私有软件。然后就有人看不下去了,跳出来说,我要写一个开源的,能跑在各种系统上支持各种RAW格式的解码器,并且咱还要用纯C来写,后来他还真写出来,就是dcraw,这牛人就是Dave Coffin,这是作者的原话”So here is my mission: Write and maintain an ANSI C program that decodes any raw image from any digital camera on any computer running any operating system.”
现在linux下大部分开源的raw处理软件都是直接拿它来解码raw片,像UFRaw、RawTherapee等,因为dcraw是cli的,这些软件一都是gui的,操作友好。据说早期很多商业软件包括Adobe Camera Raw都是基于dcraw的,可见不是一般的nb啊。
虽然有ufraw这些图形界面的raw developer可以用,但是相对于命令行来说,图形界面往往会隐藏很我功能,所以要想体会dcraw的真正强大之处,最好直接使用dcraw,而不是ufraw。有个老外写了个dcraw教程,非常详细,看这里 dcraw tutorial 。
四、实验
提取raw缩略图和显示图片meta: ./output/bin/dcraw -i -v -e ./tests/007.cr2
需要测试全部主流相机的格式能都支持,dcraw基本支持所有设置,具体list可见dcraw官网介绍。
raw转为tiff: ./output/bin/dcraw -v -w -H 1 -o 0 -q 3 -4 -T ./tests/007.cr2
tiff转其他格式:../output/bin/convert ./007.tiff 007.png
五、线上集成
1.直接用dcraw二进制./output/bin/dcraw -e ./tests/007.cr2 提取出jpeg格式缩略图,然后对jpeg格式缩略图通过imagemagic生成缩略图。类似对heif格式的处理。(需要再研究下dcraw的代码,看下缩略图的格式是否确定只有jpeg格式一种,看貌似有tiff和ppm啥的)。
2.基于dcraw.c做封装后编译出so。(避免直接二进制调用,更高效,也好管理)
3.通过go通过cgo封装一体化缩略图生成工具。(基本没啥必要)
简单上线可以选择方案1,优化可以选择方案2基于dcraw做封装。
六、参考文档
- 维基百科RAW:https://zh.wikipedia.org/wiki/RAW
- ImageMagick官网:https://www.imagemagick.org/script/index.php
- dcraw介绍:http://fungo.me/photography/dcraw-introduction.html
- dcraw官网:https://www.cybercom.net/~dcoffin/dcraw/
- dcraw命令:https://blog.csdn.net/wgx571859177/article/details/80696905
- UFRAW官网:http://ufraw.sourceforge.net/Install.html#Linux