サムネイル画像高速作成ツールspeedpetalの開発 - その2 ニアレストネイバー法を試してみた
speedpetalにニアレストネイバー法を適用してみました。ニアレストネイバー法は、単純に変換後の位置に該当する変換前画像のピクセルを持ってくる、という方法なので実装は簡単です。
// ニアレストネイバー法によるサムネイルの作成
void nearest_neighbor(JSAMPARRAY in_buffer, JSAMPARRAY out_buffer, int origin_width, int origin_height, int width, int height, int components) {
double width_factor = (double)origin_width / width;
double height_factor = (double)origin_height / height;
int width_pos[width];
for(int x = 0; x < width; x++) {
width_pos[x] = (int)(x * width_factor) * components;
}
for(int y = 0; y < height; y++) {
int height_pos = (int)(y * height_factor);
for(int x = 0; x < width; x++) {
memcpy(&out_buffer[y][x * components], &in_buffer[height_pos][width_pos[x]], components);
}
}
}
こんな感じ。
できあがるサムネイル画像は200x200くらいになると荒さが目立ちます。速い代わりに汚くなるのがニアレストネイバー法なのです。といっても100x100くらいになれば、荒さも目立たなくなるので全然有用だと思います。