ドット絵の画像を拡大すると、ぼやけてしまいドット絵のテイストがなくなってしまいます。
これはバイリニア補間のような、周辺の画素値を用いて滑らかに画素が並ぶよう補間するアルゴリズムを用いているためです。
一般的な画像の拡大には効果的なのですが、ドット絵のテイストを保持したまま拡大したい場合には適しません。
ドット絵のテイストを保持したまま拡大すると以下のようになります。
このドット絵のテイストを保持したまま画像を拡大するプログラムをOpenCVを用いて作りました。
@mori0091さんのご指摘により、非常に簡潔なコードとなりました。(2014/4/30修正)
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int main(int argc, char *argv[])
{
using namespace cv;
// 拡大の倍率
const int zoom_factor = 10;
// 入力画像ファイル
const Mat src_img = imread("sample.png");
// 出力画像ファイル
Mat dst_img;
resize(src_img, dst_img, Size(), zoom_factor, zoom_factor, INTER_AREA);
// 出力画像の保存
imwrite("output.png", dst_img);
// 出力画像の表示
imshow("output", dst_img);
waitKey(0);
}
アルファチャンネル付きのPNG画像を拡大する場合は、画像を読み込む際にアルファチャンネルの値も含めて読み込む指定をする必要があります。
プログラムは以下のようになります。
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int main(int argc, char *argv[])
{
using namespace cv;
// 拡大の倍率
const int zoom_factor = 10;
// 入力画像ファイル
const Mat src_img = imread("sample.png", -1);
// 出力画像ファイル
Mat dst_img;
resize(src_img, dst_img, Size(), zoom_factor, zoom_factor, INTER_AREA);
// 出力画像の保存
imwrite("output.png", dst_img);
// 出力画像の表示
imshow("output", dst_img);
waitKey(0);
}
ちなみにPhotoshopで、イメージ → サイズ変更 → 画像解像度 を選択し、ニアレストネイバー法を選んで解像度を変えても同じことができます。
上記で使用したドット絵は全てREFMAPさんよりお借りしました。