boost::gil で jpg の read/write をしてみた

2009 年 6 月 21 日 | カテゴリー: プログラム

20090621 Boost GIL で jpg の読み書き

C++ の Boost に含まれている画像処理ライブラリに boost::gil というのがあって、OpenCV か Gimp のライブラリを見てみようかと思ってたんですが、こっちを先に使ってみました。
GIL は Generic Image Library の略で、Adobe が出してるみたいですよ。

Boost GIL ではリンクオプションを忘れるな

んでまあ jpg の read/write を最初にやってみたわけですが、提供されている関数群がみんな void で、外部から与えられたメモリ領域に書き込みを行う、副作用どんとこいな関数ばかり。

あと C++ とか素人すぎて、コンパイルが通せなくてめっさ悩みました。
今回の例だと libjpeg を使う必要があって、boost/gil/extension/io/jpeg_io.hpp の中でちゃんと include されてるから、こちらが明示的に include する必要はないはずなんだけどなーとかなんとか悩んでいたら、リンクオプションが足りなくない?というオチ。
NetBeans のプロジェクトプロパティから -ljpeg を追加したらコンパイル通りました。

Boost GIL で jpg をコピーしてみた

無事 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);
}
コメントはまだありません。