#include "DxLib.h"
#include <fstream> //ファイル読み書き用
#define FILENAME "myAcce.acce" //リージョンを保存するファイル名
#define IMG_FILE "body.png" //画像ファイル名
#define ALPHA_S (200) //アルファ値(これ以下の値はリージョンから除外。)
#define DELETE_ALLTIME (false) //true にすると、毎回起動時にリージョンを作成。false なら FILENAME のファイルが存在しないときのみリージョンを新規作成。
/*--- 名前がfilenameであるファイルが存在するかどうかを調査 ---*/
int fexist(const char *filename)
{
FILE *fp;
if ((fp = fopen(filename, "r")) == NULL)
return (0);
fclose(fp);
return (1);
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
//DX ライブラリ初期化
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
//画像ロード
int softIHandle = LoadSoftImage(IMG_FILE) ;
//画像のサイズ取得
int width, height;
GetSoftImageSize( softIHandle, &width, &height ) ;
//画像のサイズにウィンドウの形を合わせる。
SetGraphMode( width , height , 32 ) ;
//リージョン
HRGN myRegion;
//リージョンを新規作成か、データからロードかの分岐
if(!fexist(FILENAME) || DELETE_ALLTIME){
//新規作成する。
//とりあえず、リージョンを画像のサイズに合わせる。
myRegion = CreateRectRgn(0,0,width,height);
//画像のすべてのピクセルを調べる。
for(int x = 0; x < width;x++){
for(int y = 0; y < height;y++){
int r,g,b,a;
GetPixelSoftImage( softIHandle, x , y, &r, &g, &b, &a ) ;
//(x,y)のピクセルのアルファ値が、ALPHA_S未満のとき、リージョンの範囲外とする。
if(a < ALPHA_S){
//1ピクセル四方のリージョン作成。
HRGN dotRegion = CreateRectRgn(x ,y,x+1,y+1);
//これまでの領域からこのリージョンを排除。
CombineRgn(myRegion, myRegion, dotRegion, RGN_DIFF);
DeleteObject(dotRegion);//後処理
}
}
}
RGNDATA *data; //リージョンデータ
//保存に必要なバッファサイズ取得
DWORD bufferSize = GetRegionData( myRegion, 0,NULL);
//バッファに応じて確保
data = (RGNDATA*)HeapAlloc( GetProcessHeap(), 0, bufferSize );
//data にリージョンのデータを格納。
GetRegionData( myRegion, bufferSize,data);
//指定されたファイルに、バッファサイズとdataを書き込む。
std::ofstream ofs( FILENAME );
ofs.write(( char * )&bufferSize, sizeof(bufferSize));
ofs.write(( char * ) data, bufferSize);
ofs.close();
//HRGN testWin = ExtCreateRegion(NULL, bufferSize, data);
HeapFree(GetProcessHeap(), 0, data);
}
続く。。。。