wolfmasa's blog

フロンターレとプログラミング関係の話題を、気が向いたときにつぶやくブログです。

RubyのC拡張を使って、RAWをデコードするgemを作りました。

RubyでRAWファイル*のデコードが出来るgemがなかったので作ってみました。

github.com

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としてppmtiffとして出力するところをリリースしてみた。

使い方は、

require 'ruby-raw'

filepath = "~/IMG_0001.CR2"
opt = {:print_message: true}
Rubyraw::Raw.new.decode(filepath, opt)

みたいに実行すると、ファイルと同じ場所にppmファイルとかを出力できるはず。

はず。

テストとリリース

コマンドは簡単だったので、

rake build
rake test
rake release

みたいにしてできるのは、素晴らしい。

qiita.com

  • デジタル一眼レフカメラなどで出力されるRAWファイルと呼ばれる形式。通常は、ベイヤと呼ばれるセンサが取得した生のデータを保存しているため、JPGなどよりもbit精度も高く、編集に適している。