手前味噌ですが, 以前oF本家に投げてたPRがmergeされてたのでご紹介.
ofImageLoadSettings
?
FreeImageのjpegの読み込み時のオプション設定です.
0.9.3辺りから使えるはず. (0.10までお預けのようです. master branchには入っています)
(今後他のフォーマットにも拡張されるかも?)
使い方
ofImageLoadSettings setting;
setting.accurate = true;
setting.grayscale = true;
ofImage image;
image.load(file_path, setting);
なにこれ?
settingは現在4つの項目を持っています.
プロパティ | 効果 |
---|---|
accurate |
true に設定すると読み込み時に精度重視で読み込む.false のときは速度重視 |
grayscale |
true に設定するとグレースケールで読み込む |
separateCMYK |
true に設定するとCMYKでseparateしてくれるはず(あまり調べてない) |
exifRotate |
true に設定するとEXIF情報に合わせて回転してくれるはず(あまり調べてない) |
以上です.
グレースケールにしてくれるのとか結構便利そうな気がしない?
accurate
そもそもこれを見つけた原因がoFでjpeg読み込むとなんか荒れない?って話をmotoishmzとしたことがきっかけ.
そもそもjpegって符号化されたデータの小さい成分無視しても大体見れる(大体上15%くらい読んだらとりあえず元の絵に近い物が出てくる)のでデコーダーによっては「小さい部分無視したら速くなって最高!」って言いながらそういう実装してるわけですね.
で, oFの内部で使われてるFreeImage調べてたらなんかそんな風なオプションあるぞと. これじゃん!
って思ったけどそれはofImage内で固定されてたのでその設定外出ししようぜ, と言って投げたのがこれのPRなわけです.
そんなことを踏まえるとどんだけ速度に差が出るんだよ!って気になりますよね.
double d = 0.0;
d = ofGetElapsedTimeMillis();
setting.accurate = true;
for(std::size_t i = 0; i < loopNum; i++) {
ofImage image;
image.load(img_path, setting);
}
ofLogNotice("accurete") << long(ofGetElapsedTimeMillis() - d) * 0.001;
d = ofGetElapsedTimeMillis();
setting.accurate = false;
for(std::size_t i = 0; i < loopNum; i++) {
ofImage image;
image.load(img_path, setting);
}
ofLogNotice("not accurete") << long(ofGetElapsedTimeMillis() - d) * 0.001;
やってみました.
結果,
- 600x450の画像を1000回
- accurete: 4.919
- not accurete: 3.287
- 148%高速
- 1024x718の画像を1000回
- accurate: 13.920
- not accurate: 9.879
- 140%高速
- 1920x1280の画像を1000回
- accurate: 54.1
- not accurate: 51.268
- 105%高速
うーん.
大きくなってくるとそんなに劇的な変化は無いですね.
気持ち速い, くらい.
小さいファイルを大量に読み込むときは50%くらい速くなるって考えるとそこそこ?
ちなみにデフォは全部falseなので速い方です.
「jpegで作ったテクスチャが汚いぞ?」とか「背景に綺麗な夕焼けの写真を敷きたいのにジャギが気になるぞ?」って思った場合はお試しください.
load時の設定だけでそれ以降は速度に影響無いはずです.