#include "myWin.h" #include "math.h" #define XST 420 #define YST 10 #define GWIDTH 400 #define GHIGHT 400 #define RED(X) (X & 0xFF) #define GREEN(X) ((X>>8) & 0xFF) #define BLUE(X) ((X>>16) & 0xFF) static HBITMAP hBM[2];static HDC hBuff[2]; static BITMAP bM[2]; void clearBitmap(int i){//ビットマップのクリア SelectObject(hBuff[i], GetStockObject(NULL_PEN)); PatBlt(hBuff[i], 0,0,GWIDTH,GHIGHT,WHITENESS);//黒塗り } void createBitmap(HWND hw){//ビットマップの設定 HDC hdc=GetDC(hw); for(int i=0;i<2;i++){ hBM[i]=CreateCompatibleBitmap(hdc,GWIDTH,GHIGHT); hBuff[i]=CreateCompatibleDC(hdc); SelectObject(hBuff[i], hBM[i]); clearBitmap(i); } } int pixel(int i, int j){//画像1からピクセルを取り出す return GetPixel(hBuff[1], i,j); } void setPixel(int i, int j, COLORREF C){//画像0にピクセルを設定する SetPixel(hBuff[0], i,j, C); } int NRED= 2 ; // REDの階調数 int NGREEN= 2; // GREENの階調数 int NBLUE= 2; // BLUEの階調数 int defCoff=100; // 拡散比率 % int red [GWIDTH][GHIGHT]; int green[GWIDTH][GHIGHT]; int blue [GWIDTH][GHIGHT]; int monoChro=false; void getRGB(){//RGBデータの取り出し for(int j=0;j=0 && ii=0 && jj255)?255:((R<0)?0:R); G=(green[i][j]/DG)*XG; G=(G>255)?255:((G<0)?0:G); B=(blue [i][j]/DB)*XB; B=(B>255)?255:((B<0)?0:B); setPixel(i,j,RGB(R,G,B)); defusionError(i,j, red[i][j]-R, green[i][j]-G, blue[i][j]-B, Mat, TT); } } void procRButtonDown(HWND hw, WPARAM wp,LPARAM lp){ clearBitmap(0);//画像0をクリア InvalidateRect(hw,NULL,TRUE); } HWND createLabel(HWND hw, TCHAR text[], int x, int y, int width, int height, int id){ return CreateWindow(TEXT("STATIC"),text, WS_CHILD | WS_VISIBLE | SS_CENTER, x, y, width,height, hw, (HMENU)id, hInstance, NULL); } HWND createEdit(HWND hw,TCHAR str[], int x, int y, int width, int height, int id){ return CreateWindow(TEXT("EDIT"),str, WS_CHILD | WS_VISIBLE | WS_BORDER |ES_CENTER | ES_OEMCONVERT | ES_WANTRETURN, x,y, width,height, hw, (HMENU)id, hInstance, NULL); } HWND createCombo(HWND hw,LPCTSTR text[10],int N, int x, int y, int width, int height, int id){ HWND combo1= CreateWindow(TEXT("COMBOBOX") ,NULL, WS_CHILD|WS_VISIBLE|CBS_SIMPLE|CBS_DROPDOWN|LBS_NOTIFY, x,y,width,height,hw,(HMENU)id, hInstance, NULL); for(int i=0;i=TCHAR('0') && lstr[i]2 ){ GetWindowText(edMAT[i][j],str,62); Mat[i][j]=getInt(str); } } GetWindowText(edCol[0],str,62); NRED = getInt(str); GetWindowText(edCol[1],str,62); NGREEN = getInt(str); GetWindowText(edCol[2],str,62); NBLUE = getInt(str); if(NRED <2) NRED =2; if(NRED >256) NRED =256; if(NGREEN<2) NGREEN=2; if(NGREEN>256) NGREEN=256; if(NBLUE <2) NBLUE =2; if(NBLUE >256) NBLUE =256; GetWindowText(edCoff,str,62);defCoff = getInt(str); defCoff; defusionProc(Mat); InvalidateRect(hw,NULL,TRUE); } void errorDefusionMonoChro(HWND hw){ monoChro=true; errorDiffusion(hw);monoChro=false; } static LPCTSTR colorName[]={TEXT("8色(3bits)"), TEXT("64色(6bits)"), TEXT("256色(83bits)"), TEXT("4,096色(12bits)"), TEXT("32,768色(15bits)")}; static LPCTSTR methodName[]={TEXT("Floyd-Steinberg"), TEXT("False Floyd-Steinberg"), TEXT("Javis, Judice, and Ninke(JNN)"), TEXT("Stucki"),TEXT("Burkes"), TEXT("Atkinson"),TEXT("Sierra"), TEXT("Two Row Sierra"), TEXT("Sierra Lite"), TEXT("My Recomendable Matrix")} ; int matTab[][3][5]={ {{0, 0, 0, 7, 0}, {0, 3, 5, 1, 0}, {0, 0, 0, 0, 0}}, {{0, 0, 0, 3, 0}, {0, 0, 3, 2, 0}, {0, 0, 0, 0, 0}}, {{0, 0, 0, 7, 5}, {3, 5, 7, 5, 3}, {1, 3, 5, 3, 1}}, {{0, 0, 0, 8, 4}, {2, 4, 8, 4, 2}, {1, 2, 4, 2, 1}}, {{0, 0, 0, 8, 4}, {2, 4, 8, 4, 2}, {0, 0, 0, 0, 0}}, {{0, 0, 0, 1, 1}, {0, 1, 1, 1, 0}, {0, 0, 1, 0, 0}}, {{0, 0, 0, 5, 3}, {2, 4, 5, 4, 2}, {0, 2, 3, 2, 0}}, {{0, 0, 0, 4, 3}, {1, 2, 3, 2, 1}, {0, 0, 0, 0, 0}}, {{0, 0, 0, 2, 0}, {0, 1, 1, 0, 0}, {0, 0, 0, 0, 0}}, {{0, 0, 0, 8, 0}, {0, 2, 4, 1, 0}, {0, 0, 1, 0, 0}}}; void selectMethod(HWND hw){ TCHAR str[20]; int r=SendMessage(cmMethod, CB_GETCURSEL,0,0L); SetWindowText(edMAT[0][0],TEXT("")); SetWindowText(edMAT[0][1],TEXT("")); SetWindowText(edMAT[0][2],TEXT("*")); for(int i=0;i<3;i++)for(int j=0;j<5;j++){ if(i!=0 || j>2 ){ if(matTab[r][i][j]==0) str[0]=0; else wsprintf(str, TEXT("%d"),matTab[r][i][j]); SetWindowText(edMAT[i][j],str); } } //MessageBox(hw,str, TEXT("Check"),MB_OK); } int colTab[5][3]={{2,2,2}, {4,4,4},{8,8,4},{16,16,16},{32,32,32}}; void selectColor(HWND hw){ TCHAR str[20]; int r=SendMessage(cmColor, CB_GETCURSEL,0,0L); for(int i=0;i<3;i++){ wsprintf(str, TEXT("%d"),colTab[r][i]); SetWindowText(edCol[i],str); } } void draw24bits(HWND hw){//元画像 BitBlt(hBuff[0],0,0,GWIDTH, GHIGHT, hBuff[1], 0,0,SRCCOPY); InvalidateRect(hw,NULL,TRUE); } void changeColor(HWND hw, WPARAM wp){//元画像 if(HIWORD(wp)==CBN_SELCHANGE) selectColor(hw); } void changeMethod(HWND hw, WPARAM wp){//元画像 if(HIWORD(wp)==CBN_SELCHANGE) selectMethod(hw); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){//初期処理 //TCHAR str[256]; createLabel(hw,TEXT("RED"), 500, 10, 50,20, 2001); createLabel(hw,TEXT("GREEN"),550, 10, 50,20, 2002); createLabel(hw,TEXT("BRUE"), 600, 10, 50,20, 2003); createLabel(hw,TEXT("階調"), 420, 40, 50,20, 2004); edCol[0] =createEdit(hw, TEXT("2") , 500, 40, 50, 20, ED_RED); edCol[1] =createEdit(hw, TEXT("2"), 550, 40, 50, 20, ED_GREEN); edCol[2] =createEdit(hw, TEXT("2") , 600, 40, 50, 20, ED_BLUE); createLabel(hw,TEXT("行列"), 420, 100, 50,20, 2004); for(int j=0,y=100;j<3;j++,y+=30) for(int i=0,x=500;i<5;i++,x+=60) edMAT[j][i] =createEdit(hw, TEXT("") , x, y, 50, 20, ED_RED); bt3 =createButton(hw, TEXT("誤差拡散") , 500, 200, 80, 30, BT_1); bt4 =createButton(hw, TEXT("単色誤差拡散") , 580, 200, 120, 30, BT_2); bt5 =createButton(hw, TEXT("元画像") , 700, 200, 80, 30, BT_3); cmMethod=createCombo(hw,methodName,10,500,300,300,350,CM_METHOD); SendMessage(cmMethod, CB_SETCURSEL,0,0L); createLabel(hw,TEXT("拡散比"), 420, 250, 50,20, 2001); edCoff =createEdit(hw, TEXT("100") , 500, 250, 50, 20, ED_COFF); createLabel(hw,TEXT("% (Atkinsonのとき75%)"), 550, 250, 200,20, 2001); cmColor =createCombo(hw,colorName, 5, 700,37, 120,250,CM_COLOR); SendMessage(cmColor, CB_SETCURSEL,0,0L); createBitmap(hw);MoveWindow(hw,0,0,850,460,TRUE); hBM[1]=LoadBitmap(hInstance, TEXT("kodomo"));//画像1に表示 GetObject(hBM[1],sizeof(BITMAP), &bM[1]); selectMethod(hw); selectColor(hw); SetWindowText(hw,TEXT("Error Diffusion Dithering")); InvalidateRect(hw,NULL,TRUE); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){//画面表示 PAINTSTRUCT ps; HDC hdc = BeginPaint(hw,&ps); SelectObject(hBuff[0],hBM[0]);SelectObject(hBuff[1],hBM[1]); BitBlt(hdc,10,YST,GWIDTH, GHIGHT, hBuff[0], 0,0,SRCCOPY); //BitBlt(hdc,XST,YST,GWIDTH, GHIGHT, hBuff[1], 0,0,SRCCOPY); EndPaint(hw,&ps); } void procCommand(HWND hw, WPARAM wp,LPARAM lp){ switch(LOWORD(wp)){ case BT_1: errorDiffusion(hw); return; case BT_2: errorDefusionMonoChro(hw); return; case BT_3: draw24bits(hw); return; case CM_METHOD: changeMethod(hw, wp); return; case CM_COLOR: changeColor(hw, wp); return; } } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate(hw,wp,lp); return 0; case WM_COMMAND : procCommand(hw,wp,lp); return 0; case WM_RBUTTONDOWN : procRButtonDown(hw,wp,lp); return 0; case WM_PAINT : procPaint (hw,wp,lp); return 0; } return DefWindowProc(hw,msg,wp,lp); }