RubyのC拡張を使って、RAWをデコードするgemを作りました。
RubyでRAWファイル*のデコードが出来るgemがなかったので作ってみました。
C拡張でdrawを呼ぶ
基本は、その道では有名なdcrawというライブラリを使いたかったけど、純粋なCで実装されているためにRubyのC拡張の機能を使って実装してみた。
Decoding raw digital photos in Linux
単純にCのコードを呼び出すだけとはいえ、せっかくなのでオプションをハッシュで受け取るようにしたいと思い、C拡張の機能を手探りで探し、変換するコードを書いてみました。
RubyのC拡張とか使うことないので、大変だったけどいい勉強になった。
if(opt != Qnil){ if(Qtrue == rb_hash_aref(opt, ID2SYM(rb_intern("debug_mode")))) debug_mode = 1; if(Qtrue == rb_hash_aref(opt, ID2SYM(rb_intern("print_message")))) v[c++] = "-v"; if(Qtrue == rb_hash_aref(opt, ID2SYM(rb_intern("apply_awb")))) v[c++] = "-a"; if(Qtrue == rb_hash_aref(opt, ID2SYM(rb_intern("tiff_mode")))) v[c++] = "-T"; }
余談ですが、C拡張はruby/doc/にドキュメントがあるけど、ハッシュなどはそこに含まれていないので、実際にhash.cなどのソースを見ながらAPIを調べる感じでやっていったので、結構時間がかかった。
どこかにまとまったドキュメントとかあるんだろうか。
他のオプションもたくさんあるけど、まずは0.0.1としてppmとtiffとして出力するところをリリースしてみた。
使い方は、
require 'ruby-raw' filepath = "~/IMG_0001.CR2" opt = {:print_message: true} Rubyraw::Raw.new.decode(filepath, opt)
みたいに実行すると、ファイルと同じ場所にppmファイルとかを出力できるはず。
はず。
テストとリリース
コマンドは簡単だったので、
rake build rake test rake release
みたいにしてできるのは、素晴らしい。
- デジタル一眼レフカメラなどで出力されるRAWファイルと呼ばれる形式。通常は、ベイヤと呼ばれるセンサが取得した生のデータを保存しているため、JPGなどよりもbit精度も高く、編集に適している。