
這篇教學最主要的目的,並不是希望可以寫出什麼取代掉Lightroom之類的重量級商業的程式,那些有規模的商業軟體基本上已經有相當的成熟度,使用的演算法和最後出來的畫質效果也難以被取代,撰寫這篇教學主要的目的,是想藉由直接撰寫程式來解raw,透過程式的處理過程,能讓大家對於raw的概念.內部技術.相關計算方法有更深入的了解,也一舉終結網路上許多的疑問與誤解,直接徹底剖析raw的奧秘,倒也不是說要寫出什麼更目前上更棒的軟體或是開發出更好的演算法(雖然這的確是很有趣的挑戰...),當然牽涉到程式撰寫,閱讀者就一定要有基本的程式撰寫能力底子在,倒也不是說需要有多強的coding能力,而是至少可以看得懂程式大概在作什麼就夠了(這邊使用的語言是C/C++,相信很多人應該都有學習過這套語言的經驗).
首先先說一下什麼是影像raw檔
http://en.wikipedia.org/wiki/Raw_image_format
,基本上就是儲存數位相機最原始影像數據格式的儲存檔案,不同的相機可能會使用不同的檔案封裝方式,不過大略上組成是都大同小異的,檔案內的內容可能包括有拍攝時相關的條件參數記錄數據(像是拍攝時間.使用光圈.iso.快門.GPS位置.拍攝模式.閃光燈有無與模式.....)
. 影像原始數據(當然這是最大的重點) . 預覽圖片(通常RAW檔會附一個小張的JPG檔供快速預覽用) .
以及一些各家廠商記錄的修正參數資料(這些參數會用來修正最後的輸出成像) , 大體上就區分成這幾個部分, 這幾個部分儲存在檔案中的位置(adder)
每家都不一樣,說真的沒有spec有點難分析,不過就我了解多數檔案儲存規格多是由tiff封裝架構修改而來的就是...
一般人想要自己處理raw檔最大的阻礙,以我自己個人的經驗來說,應該就是正確截取檔案本身數據資料的問題,因為架構未知,要從哪個位置開始讀資料,然後資料以什麼排列的方式組合都是未知,由於根本抓不出正確的影像資料格式,根本無法談更後續的處理,我曾經考慮使用DNG方案,任何影像RAW檔都可以轉換成DNG
http://en.wikipedia.org/wiki/Digital_Negative 檔案封裝方式,再藉由DNG SDK處理
http://www.adobe.com/support/downloads/dng/dng_sdk.html
, 無奈後來發現DNG SDK所提供的操作太高階了,無法處理到最底層的原始數據,因此改換跑掉研究一款open sources的解raw軟體 dcraw
http://www.cybercom.net/~dcoffin/dcraw ,
基本上我是利用它來抓取我要的原始影像數據資料,當然它原來並不提供這個功能,我有修改了它部分原始碼,如底下