前言
项目中需要将imx185出来的raw数据转成dng格式,一开始认为很简单的事情,后面才发现还是挺复杂的!!!首先考虑的是不写任何代码,直接用adobe提供的转换工具来转,结果发现,不仅是adobe的工具,网上能够找到的工具(所谓的raw转dng)都是针对各大厂商的raw,而不能支持最原始的bayer raw。于是又考虑了两种解决方式,第一种就是将bayer raw随便转换成某一个厂商的raw(CR2, CRW, DNG, MRW, NEF, ORF, RAF, DCR, ARW中的一种),然后用所谓的raw转dng工具再转dng,结果发现厂商的raw一般都是不开放的,网上虽然有一些逆向工程,但不完整,没办法,只好用第二种方案了。第二种方案是考虑基于adobe提供的dng_sdk开发一个bayer转dng的程序,但是这个工作量真的很大,首先得完全弄懂dng格式,其次,adobe的sdk没有任何文档(html文件夹下有点点,但那个没多大作用),网上也找到不任何关于该sdk的说明!没办法,只好边看dng_spec_1.4.0.0
边一步步解决。幸运的时,偶然在论坛上发现了两个关于bayer转dng的讨论,根据他们的代码,实现了转换。
dng_sdk linux移植具体步骤
adobe官方提供的dng_sdk
只有windows和mac版本,而我用的是linux系统,所以得想办法将其移植到linux里去。网上有有两种方案可以参考,方案一,一步一步按照他说的移植就ok了,方案二,也是一步一步根据他里面的文档并结合dng_sdk文档来移植。两种方案我都有试过,都是可行的,下面我主要基于第二种方案来说说具体的实践过程。
安装依赖jpeg
在ubuntu下,要安装jpeg依赖很简单,一条命令搞定
sudo apt-get install cmake libjpeg8-dev uuid-dev
安装依赖xmp sdk
下载xmp_sdk
wget http://download.macromedia.com/pub/developer/xmp/sdk/XMP-Toolkit-SDK-CC-201306.zip
unzip XMP-Toolkit-SDK-CC-201306.zip
mv XMP-Toolkit-SDK-CC201306 xmp_sdk
然后根据xmp_sdk/third-party下各子目录里的ReadMe.txt安装其他一些依赖
zlib
cd xmp_sdk/third-party/zlib
wget http://zlib.net/zlib-1.2.8.tar.gz
tar xzf zlib-1.2.8.tar.gz
cp zlib-1.2.8/*.h zlib-1.2.8/*.c .
expat
cd xmp_sdk/third-party/expat
Download here the source at http://sourceforge.net/projects/expat/files/expat/2.1.0/expat-2.1.0.tar.gz/download.
tar xzf expat-2.1.0.tar.gz
cp -R expat-2.1.0/lib .
dng sdk编译
在xmp_sdk文件夹所在的目录下执行以下命令获取源码
git clone https://github.com/yanburman/dng_sdk.git
进入目录projects/linux/,执行make即可编译生成dng_validate,该工具用于校验dng文件,后面生成的文件可以通过该工具来检测。
bayer转dng编译
拷贝下面的代码并命名为bayer2dng.cpp,
#include <iostream>
#include "dng_color_space.h"
#include "dng_date_time.h"
#include "dng_exceptions.h"
#include "dng_file_stream.h"
#include "dng_globals.h"
#include "dng_host.h"
#include "dng_ifd.h"
#include "dng_image_writer.h"
#include "dng_info.h"
#include "dng_linearization_info.h"
#include "dng_mosaic_info.h"
#include "dng_negative.h"
#include "dng_preview.h"
#include "dng_render.h"
#include "dng_simple_image.h"
#include "dng_tag_codes.h"
#include "dng_tag_types.h"
#include "dng_tag_values.h"
#include "dng_xmp.h"
#include "dng_xmp_sdk.h"
#include "dng_camera_profile.h"
// --------------------------------------------------------------------------------
//
// MakeDNGSample
//
int main(int argc, char *argv[])
{
// Sample BAYER image at ISO100 and tEXP 1/10 on f/4.0 and focal length 10mm
std::string m_szInputFile = "pic6";
uint16 m_unISO = 100;
double m_dExposureTime = 0.1;
double m_dLensAperture = 4.0;
double m_dFocalLength = 10.0;
// SETTINGS: 12-Bit RGGB BAYER PATTERN
uint8 m_unColorPlanes = 3;
uint8 m_unBitDepth = 12;
uint16 m_unBayerType = 1; // RGGB
uint32 m_ulWidth = 1920;
uint32 m_ulHeight = 1225;
uint32 m_ulBlackLevel = 200;
// SETTINGS: Whitebalance D65, Orientation "normal"
dng_orientation m_oOrientation = dng_orientation::Normal();
dng_xy_coord m_oWhitebalanceDetectedXY = D65_xy_coord();
// SETTINGS: Names
std::string m_szMake = "My Company";
std::str