//----------------------------------------------------------------- // ipsize.cpp: // 画像サイズの変更 // Last Update: <2004/12/13 18:13:06 A.Murakami> //----------------------------------------------------------------- #include #include "wingui.h" #include "ipcommon.h" //----------------------------------------------------------------- #define SMALL_X 0.7321 // 縮小サイズx #define SMALL_Y 0.8732 // 縮小サイズy #define LARGE_X 1.28 // 拡大サイズx #define LARGE_Y 1.42 // 拡大サイズx #define DEG 35 // 回転角[degree] #define DX 5 // 移動量x #define DY -5 // 移動量y #define INTP_TYPE INTP_LN // アフィン変換/補間形式[INTP_NN,INTP_LN,INTP_BCC] #define SCALE_LARGE // 縮小・拡大の選択 //----------------------------------------------------------------- void toOrg(); void set_ipsize(); void iSmall1(); void iSmall2(); void iSmall3(); void iSmall4(); void iCSmall(); void iAffine(); //----------------------------------------------------------------- // メニューへの追加内容 //----------------------------------------------------------------- MenuInfo MI[] = { {"元画像",toOrg}, {"最近傍法",iSmall1}, {"線形補間法",iSmall2}, {"バイキュービック法",iSmall3}, {"面積平均法",iSmall4}, {"面積平均法(カラー)",iCSmall}, {"アフィン変換",iAffine}, {NULL,NULL} }; //----------------------------------------------------------------- // 元画像の表示 //----------------------------------------------------------------- void toOrg() { set_ip_window(); CopyMemory(lpBMP,lpOrgBMP,biSize); } //----------------------------------------------------------------- // 作業域の設定 //----------------------------------------------------------------- void set_ipsize() { int xsize,ysize; xsize = rint(iWidth*SMALL_X); ysize = rint(iHeight*SMALL_Y); set_ip_window(xsize,ysize); } //----------------------------------------------------------------- // 最近傍法[拡大・縮小] //----------------------------------------------------------------- void iSmall1() { set_ip_window(); LPBYTE iGray=GetGray(); #ifdef SCALE_LARGE nn_scale(iGray,LARGE_X,LARGE_Y); #else nn_scale(iGray,SMALL_X,SMALL_Y); set_ipsize(); #endif // 表示用 GrayToColor(iGray,lpBMP); // 後片付け GlobalFree(iGray); } //----------------------------------------------------------------- // 線形補間法[拡大・縮小] //----------------------------------------------------------------- void iSmall2() { set_ip_window(); LPBYTE iGray=GetGray(); #ifdef SCALE_LARGE linear_scale(iGray,LARGE_X,LARGE_Y); #else linear_scale(iGray,SMALL_X,SMALL_Y); set_ipsize(); #endif // 表示用 GrayToColor(iGray,lpBMP); // 後片付け GlobalFree(iGray); } //----------------------------------------------------------------- // バイキュービック法[拡大・縮小] //----------------------------------------------------------------- void iSmall3() { set_ip_window(); LPBYTE iGray=GetGray(); #ifdef SCALE_LARGE bcc_scale(iGray,LARGE_X,LARGE_Y); #else bcc_scale(iGray,SMALL_X,SMALL_Y); set_ipsize(); #endif // 表示用 GrayToColor(iGray,lpBMP); // 後片付け GlobalFree(iGray); } //----------------------------------------------------------------- // 面積平均法による縮小 //----------------------------------------------------------------- void iSmall4() { set_ip_window(); LPBYTE iGray=GetGray(); #ifdef SCALE_LARGE sqm_scale(iGray,LARGE_X,LARGE_Y); #else sqm_scale(iGray,SMALL_X,SMALL_Y); set_ipsize(); #endif // 表示用 GrayToColor(iGray,lpBMP); // 後片付け GlobalFree(iGray); } //----------------------------------------------------------------- // 面積平均法による縮小[カラー] //----------------------------------------------------------------- void iCSmall() { toOrg(); #ifdef SCALE_LARGE c_sqm_scale(lpBMP,LARGE_X,LARGE_Y); #else c_sqm_scale(lpBMP,SMALL_X,SMALL_Y); set_ipsize(); #endif } //----------------------------------------------------------------- // アフィン変換 //----------------------------------------------------------------- void iAffine() { toOrg(); #ifdef SCALE_LARGE c_affine_transform(lpBMP,INTP_TYPE,LARGE_X,LARGE_Y,DEG,DX,DY); #else c_affine_transform(lpBMP,INTP_TYPE,SMALL_X,SMALL_Y,DEG,DX,DY); #endif }