DXライブラリで画像編集を始めてみる


最近、写真をアニメ背景風に加工する技術が流行しているらしいので、DXライブラリを使った自作ソフトで便乗していきます(思いつき)。今回は加工が行える環境を整えていきます。

所要時間は5分くらいです。

 

スポンサードリンク

前置き

画像加工ソフトを自作するということは。自分が使いたい機能が、最も使いやすい形で備わった編集ソフトを手に入れられるということなのです。ろまん、感じませんか?

最終的には、風景写真をボタン一つでアニメ風に加工できるソフトを作りたいと思っています。できるかは知らん。

必要なもの

  • VisualC++
  • DXライブラリ
  • 実行用画像ファイル

VCとDXライブラリの初期設定については下のページをどうぞ。外部サイトです。

DXライブラリを使ったプロジェクトを作ろう

 

DXライブラリを使う理由は特になし。強いて言うなら、マリオ作りで若干使い慣れていたからですね。ゲームエンジンがメインのDXですが、画像加工も意外といけそうです。

実行用素材については、下のフリー素材ををお借りしました。川良いですね。


*クリックで拡大

画像名はtest、サイズは 640×480 、形式は bmp です。

 

スポンサードリンク

画像の表示

画像の読み込みについて。DXライブラリに備わっている、GetPixelSoftImage という関数をメインウェポンとして戦っていきます。使い方は以下の通り。

int r,g,b,a;
int x=33,y=4;
int handle=LoadSoftImage("test.bmp");
GetPixelSoftImage(handle,x,y,&r,&g,&b,&a);

handle で指定された画像データの座標(x,y)の部分の色を取得し、int型のr,g,bに(透明度はaに)それぞれぶち込む。この関数640×480回実行します。なお、handleは LoadSoftImage(“画像のパス”) で指定が可能です。

for文にしてからめると以下のように。データの格納には640×480×4のint型配列、Crを使用しました。ループの回数は画像サイズに合わせて自動で変更できると良しですが、今回は割愛。

int Cr[640][480][4];
for(int x=0;x<640;x++){
	for(int y=0;y<480;y++){
		GetPixelSoftImage(handle,x,y,&Cr[x][y][0],&Cr[x][y][1],&Cr[x][y][2],&Cr[x][y][3]);
	}
}

余談ですが、巨大配列をローカル変数として扱ってしまい、メモリをオーバーフローさせるというアホをやらかしました。ご参考までに。

続いて、今取得した配列をもとに点を打っていきます。DrawPixel という点描写用関数を640×480回呼び出します。ちなみにこの処理回数、計算すると307200回だとか。パソコンすげえ(小並)

for(int x=0;x<640;x++){
	for(int y=0;y<480;y++){
		for(int i=0;i<3;i++){
			c[i]=Cr[x][y][i];
		}
		DrawPixel(x,y,GetColor(c[0],c[1],c[2]));
	}
}

描写部分はこんな感じ。int型の配列c[3]を使用しています。


*クリックで拡大

実行結果。元の画像そのまんまですね。

ここまでのプログラム全体は以下のとおり。

#include "DxLib.h"
int Cr[640][480][4];
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); 
	SetMainWindowText("graph");
	DxLib_Init();
	int c[3];
	int handle=LoadSoftImage("test.bmp");
	for(int x=0;x<640;x++){
		for(int y=0;y<480;y++){
			GetPixelSoftImage(handle,x,y,&Cr[x][y][0],&Cr[x][y][1],&Cr[x][y][2],&Cr[x][y][3]);
		}
	}
	DeleteSoftImage(handle);
	while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){
		for(int x=0;x<640;x++){
			for(int y=0;y<480;y++){
				for(int i=0;i<3;i++){
					c[i]=Cr[x][y][i];
				}
				DrawPixel(x,y,GetColor(c[0],c[1],c[2]));
			}
		}
	}
	DxLib_End();
	return 0;
}
スポンサードリンク