boost::gil で jpg の read/write をしてみた
C++ の Boost に含まれている画像処理ライブラリに boost::gil というのがあって、OpenCV か Gimp のライブラリを見てみようかと思ってたんですが、こっちを先に使ってみました。
GIL は Generic Image Library の略で、Adobe が出してるみたいですよ。
んでまあ jpg の read/write を最初にやってみたわけですが、提供されている関数群がみんな void で、外部から与えられたメモリ領域に書き込みを行う、副作用どんとこいな関数ばかり。
あと C++ とか素人すぎて、コンパイルが通せなくてめっさ悩みました。
今回の例だと libjpeg を使う必要があって、boost/gil/extension/io/jpeg_io.hpp の中でちゃんと include されてるから、こちらが明示的に include する必要はないはずなんだけどなーとかなんとか悩んでいたら、リンクオプションが足りなくない?というオチ。
NetBeans のプロジェクトプロパティから -ljpeg を追加したらコンパイル通りました。
無事 input.jpg を output.jpg にコピーできましたとさ。
つまらない例でごめんなさい(ぇー
元の関数がデータを破壊してくるのでラップして無駄なインスタンスコピーを走らせる実装にしちゃったけど、C++ でこういうの、どう書けばいいんでしょうか。リファクタリング歓迎。
画像処理ってからには速さが命な気もするんですが、Haskell みたいなかんじで書けないんですかね。
/*
* File: Main.cpp
* Author: kei
*
* Created on 2009/06/21
*/
#include <stdlib.h>
#include <boost/gil/gil_all.hpp>
#include <boost/gil/extension/io/jpeg_io.hpp>
using namespace std;
using namespace boost;
using namespace boost::gil;
/**
* 入力ファイル名を返します。
* @return 入力ファイル名
*/
const string inputFilename() {
return string("input.jpg");
}
/**
* 出力ファイル名を返します。
* @return 出力ファイル名
*/
const string outputFilename() {
return string("output.jpg");
}
/**
* 指定したファイル名の jpg 画像データを返します。
* @param inputFilename 入力画像ファイル名
* @return jpg 画像データ
*/
const rgb8_image_t readImage(const string& inputFilename) {
rgb8_image_t imageMemory;
jpeg_read_image(inputFilename, imageMemory);
return imageMemory;
}
/**
* 指定したファイル名で、画像データをファイルに出力します。
* @param outputFilename 出力画像ファイル名
* @param outputImage 出力画像
*/
void writeImage(const string& outputFilename, const rgb8_image_t& outputImage) {
jpeg_write_view(outputFilename, const_view(outputImage));
}
/*
* メインエントリです。
* input.jpg という jpg 画像ファイルを output.jpg という名前でコピーします。
* @param argc
* @param argv
*/
int main(int argc, char** argv) {
writeImage(outputFilename(), readImage(inputFilename()));
return (EXIT_SUCCESS);
}




