// オフセットかけて足すゴースト除去 #include #include "../filter.h" //--------------------------------------------------------------------- // フィルタ構造体定義 //--------------------------------------------------------------------- #define GHOST_MAX_REDUCTION 1024 // 計算速度で有利? // トラックバー #define TRACK_N 2 TCHAR *track_name[TRACK_N] = { "移動", "減衰" } ; int track_default[TRACK_N] = { 0, 0 } ; int track_s[TRACK_N] = { 0, -GHOST_MAX_REDUCTION/8 }; int track_e[TRACK_N] = { 856, GHOST_MAX_REDUCTION/8 }; // チェックボックスの数 #define CHECK_N 1 TCHAR *check_name[] = { "左側" }; int check_default[] = { 0 }; FILTER_DLL filter = { FILTER_FLAG_EX_INFORMATION, // フィルタのフラグ 0,0, // 設定ウインドウのサイズ(無意味) "幽霊退治0", // フィルタの名前 TRACK_N, // トラックバーの数 track_name, // トラックバーの名前 track_default, // トラックバーの初期値 track_s, track_e, // トラックバーの数値の下限上限 CHECK_N, // チェックボックスの数 check_name, // チェックボックスの名前 check_default, //チェックボックスの初期値 func_proc, // フィルタ処理関数 NULL, // 開始時に呼ばれる関数 NULL, // 終了時に呼ばれる関数 NULL, // 設定が変更されたときに呼ばれる関数 NULL, // 設定ウィンドウにウィンドウメッセージが来た時に呼ばれる関数 NULL,NULL, // システムで使用 NULL, // 拡張データ領域(なし) 0, // 拡張データサイズ(なし) "幽霊退治 by JOE", // フィルタ情報 NULL, // セーブが開始される直前に呼ばれる関数 NULL, // セーブが終了した直後に呼ばれる関数 }; //--------------------------------------------------------------------- // フィルタ構造体のポインタを渡す関数 //--------------------------------------------------------------------- EXTERN_C FILTER_DLL __declspec(dllexport) * __stdcall GetFilterTable( void ) { return &filter; } //--------------------------------------------------------------------- // フィルタ処理関数 //--------------------------------------------------------------------- BOOL func_proc( FILTER *fp, FILTER_PROC_INFO *fpip ) { int x,y; PIXEL_YC *yc_src, *yc_ghost, *yc_dest, *swap; int iGhostOffset = fp->track[0]; // ゴーストのずれ int iGhostReduction = fp->track[1]; // 減衰値 int iImageReduction = GHOST_MAX_REDUCTION - iGhostReduction; if (fp->check[0]) goto LEFT; // 左にずらす for (y=0;yh;y++) { yc_src = yc_ghost = fpip->ycp_edit + fpip->max_w * y; yc_dest = fpip->ycp_temp + fpip->max_w * y; // 0--offset には、左端の画素を重ねる。 for (x=0;xy = (yc_src->y * iImageReduction + yc_ghost->y * iGhostReduction) / GHOST_MAX_REDUCTION; yc_dest->cb = (yc_src->cb * iImageReduction + yc_ghost->cb * iGhostReduction) / GHOST_MAX_REDUCTION; yc_dest->cr = (yc_src->cr * iImageReduction + yc_ghost->cr * iGhostReduction) / GHOST_MAX_REDUCTION; yc_src++; yc_dest++; } for (;xw;x++) { yc_dest->y = (yc_src->y * iImageReduction + yc_ghost->y * iGhostReduction) / GHOST_MAX_REDUCTION; yc_dest->cb = (yc_src->cb * iImageReduction + yc_ghost->cb * iGhostReduction) / GHOST_MAX_REDUCTION; yc_dest->cr = (yc_src->cr * iImageReduction + yc_ghost->cr * iGhostReduction) / GHOST_MAX_REDUCTION; yc_src++; yc_ghost++; yc_dest++; } } goto ENDE; LEFT: for (y=0;yh;y++) { yc_src = fpip->ycp_edit + fpip->max_w * y; yc_ghost = yc_src + iGhostOffset; yc_dest = fpip->ycp_temp + fpip->max_w * y; for (x=0;xw-iGhostOffset;x++) { yc_dest->y = (yc_src->y * iImageReduction + yc_ghost->y * iGhostReduction) / GHOST_MAX_REDUCTION; yc_dest->cb = (yc_src->cb * iImageReduction + yc_ghost->cb * iGhostReduction) / GHOST_MAX_REDUCTION; yc_dest->cr = (yc_src->cr * iImageReduction + yc_ghost->cr * iGhostReduction) / GHOST_MAX_REDUCTION; yc_src++; yc_ghost++; yc_dest++; } // -offset-w には、左端の画素を重ねる。 for (;xw;x++) { yc_dest->y = (yc_src->y * iImageReduction + yc_ghost->y * iGhostReduction) / GHOST_MAX_REDUCTION; yc_dest->cb = (yc_src->cb * iImageReduction + yc_ghost->cb * iGhostReduction) / GHOST_MAX_REDUCTION; yc_dest->cr = (yc_src->cr * iImageReduction + yc_ghost->cr * iGhostReduction) / GHOST_MAX_REDUCTION; yc_src++; yc_dest++; } } ENDE: swap = fpip->ycp_edit; fpip->ycp_edit = fpip->ycp_temp; fpip->ycp_temp = swap; return TRUE; }