001: //-----------------------------------------------------------------
002: // ipsize.cpp:
003: //    画像サイズの変更
004: //                Last Update: <2004/12/13 18:13:06 A.Murakami>
005: //-----------------------------------------------------------------
006: #include <windows.h>
007: #include "wingui.h"
008: #include "ipcommon.h"
009: //-----------------------------------------------------------------
010: #define SMALL_X 0.7321 // 縮小サイズx
011: #define SMALL_Y 0.8732 // 縮小サイズy
012: #define LARGE_X 1.28   // 拡大サイズx
013: #define LARGE_Y 1.42   // 拡大サイズx
014: #define DEG     35     // 回転角[degree]
015: #define DX      5      // 移動量x
016: #define DY     -5      // 移動量y
017: #define INTP_TYPE INTP_LN // アフィン変換/補間形式[INTP_NN,INTP_LN,INTP_BCC]
018: #define SCALE_LARGE  // 縮小・拡大の選択
019: //-----------------------------------------------------------------
020: void toOrg();
021: void set_ipsize();
022: void iSmall1();
023: void iSmall2();
024: void iSmall3();
025: void iSmall4();
026: void iCSmall();
027: void iAffine();
028: //-----------------------------------------------------------------
029: // メニューへの追加内容
030: //-----------------------------------------------------------------
031: MenuInfo MI[] = {
032:     {"元画像",toOrg},
033:     {"最近傍法",iSmall1},
034:     {"線形補間法",iSmall2},
035:     {"バイキュービック法",iSmall3},
036:     {"面積平均法",iSmall4},
037:     {"面積平均法(カラー)",iCSmall},
038:     {"アフィン変換",iAffine},
039:     {NULL,NULL}
040: };
041: //-----------------------------------------------------------------
042: // 元画像の表示
043: //-----------------------------------------------------------------
044: void toOrg() {
045:     set_ip_window();
046:     CopyMemory(lpBMP,lpOrgBMP,biSize);
047: }
048: //-----------------------------------------------------------------
049: // 作業域の設定
050: //-----------------------------------------------------------------
051: void set_ipsize()
052: {
053:     int xsize,ysize;
054:     xsize = rint(iWidth*SMALL_X);
055:     ysize = rint(iHeight*SMALL_Y);
056:     set_ip_window(xsize,ysize);
057: }
058: //-----------------------------------------------------------------
059: // 最近傍法[拡大・縮小]
060: //-----------------------------------------------------------------
061: void iSmall1()
062: {
063:     set_ip_window();
064:     LPBYTE iGray=GetGray();
065: #ifdef SCALE_LARGE
066:     nn_scale(iGray,LARGE_X,LARGE_Y);
067: #else
068:     nn_scale(iGray,SMALL_X,SMALL_Y);
069:     set_ipsize();
070: #endif
071:     // 表示用
072:     GrayToColor(iGray,lpBMP);
073:     // 後片付け
074:     GlobalFree(iGray);
075: }
076: //-----------------------------------------------------------------
077: // 線形補間法[拡大・縮小]
078: //-----------------------------------------------------------------
079: void iSmall2()
080: {
081:     set_ip_window();
082:     LPBYTE iGray=GetGray();
083: #ifdef SCALE_LARGE
084:     linear_scale(iGray,LARGE_X,LARGE_Y);
085: #else
086:     linear_scale(iGray,SMALL_X,SMALL_Y);
087:     set_ipsize();
088: #endif
089:     // 表示用
090:     GrayToColor(iGray,lpBMP);
091:     // 後片付け
092:     GlobalFree(iGray);
093: }
094: //-----------------------------------------------------------------
095: // バイキュービック法[拡大・縮小]
096: //-----------------------------------------------------------------
097: void iSmall3()
098: {
099:     set_ip_window();
100:     LPBYTE iGray=GetGray();
101: #ifdef SCALE_LARGE
102:     bcc_scale(iGray,LARGE_X,LARGE_Y);
103: #else
104:     bcc_scale(iGray,SMALL_X,SMALL_Y);
105:     set_ipsize();
106: #endif
107:     // 表示用
108:     GrayToColor(iGray,lpBMP);
109:     // 後片付け
110:     GlobalFree(iGray);
111: }
112: //-----------------------------------------------------------------
113: // 平均画素法による縮小
114: //-----------------------------------------------------------------
115: void iSmall4()
116: {
117:     set_ip_window();
118:     LPBYTE iGray=GetGray();
119: #ifdef SCALE_LARGE
120:     sqm_scale(iGray,LARGE_X,LARGE_Y);
121: #else
122:     sqm_scale(iGray,SMALL_X,SMALL_Y);
123:     set_ipsize();
124: #endif
125:     // 表示用
126:     GrayToColor(iGray,lpBMP);
127:     // 後片付け
128:     GlobalFree(iGray);
129: }
130: //-----------------------------------------------------------------
131: // 平均画素法による縮小[カラー]
132: //-----------------------------------------------------------------
133: void iCSmall()
134: {
135:     toOrg();
136: #ifdef SCALE_LARGE
137:     c_sqm_scale(lpBMP,LARGE_X,LARGE_Y);
138: #else
139:     c_sqm_scale(lpBMP,SMALL_X,SMALL_Y);
140:     set_ipsize();
141: #endif
142: }
143: //-----------------------------------------------------------------
144: // アフィン変換
145: //-----------------------------------------------------------------
146: void iAffine()
147: {
148:     toOrg();
149: #ifdef SCALE_LARGE
150:     c_affine_transform(lpBMP,INTP_TYPE,LARGE_X,LARGE_Y,DEG,DX,DY);
151: #else
152:     c_affine_transform(lpBMP,INTP_TYPE,SMALL_X,SMALL_Y,DEG,DX,DY);
153: #endif
154: }