/* アンシャープマスクの差分 2000/12/16 宍戸 輝光 */ #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); BOOL readBMP(LPCTSTR); void unsharp(); HINSTANCE hInst; HWND hwMain; LPBYTE lpDIB=NULL; LPDWORD lpPixel; LPBITMAPINFO lpbiInfo; int iRange=2,iWidth,iHeight; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASS wndclass ; hInst=hInstance; /* プロセスのハンドルを保存 */ wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; RegisterClass(&wndclass); hwMain=CreateWindow("CWindow","アンシャープマスクの差分",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,560,480,NULL,NULL,hInstance,NULL); DragAcceptFiles(hwMain,TRUE); /* ドラッグ&ドロップ受入 */ ShowWindow(hwMain,iCmdShow); /* ウインドウを表示 */ UpdateWindow (hwMain); /* 再描画 */ while (GetMessage (&msg,NULL,0,0)) { /* メッセージループ */ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDROP hDrop; HDC hdc; PAINTSTRUCT ps; TCHAR lpszFn[MAX_PATH+1]; static HWND hwBtn; switch (iMsg) { case WM_CREATE: // ボタン作成 hwBtn=CreateWindow("BUTTON","実行",WS_CHILD|WS_VISIBLE, 224,4,72,28,hwnd,(HMENU)0,hInst,NULL); break; case WM_DROPFILES: /* ファイルがドロップされた時の処理 */ hDrop=(HDROP)wParam; /* HDROPを取得 */ DragQueryFile(hDrop,0,lpszFn,256); /* ファイル名を取得 */ readBMP(lpszFn); DragFinish(hDrop); /* 終了処理 */ InvalidateRgn(hwnd,NULL,TRUE); UpdateWindow (hwnd); /* 再描画 */ break; case WM_COMMAND: if (LOWORD(wParam)==0) { unsharp(); InvalidateRgn(hwnd,NULL,FALSE); UpdateWindow(hwnd); } return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); if (lpDIB!=NULL) /* ビットマップが読み込まれていれば */ StretchDIBits(hdc,4,34,iWidth,iHeight, 0,0,iWidth,iHeight,lpPixel,lpbiInfo, DIB_RGB_COLORS,SRCCOPY); /* DIBを画面に描画 */ EndPaint(hwnd,&ps); return 0; case WM_DESTROY : if (lpDIB!=NULL) /* DIB用メモリ解放 */ GlobalFree(lpDIB); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } BOOL readBMP(LPCTSTR lpszFn) { /* ビットマップ読み込み */ DWORD offset,dummy; LPBYTE lpBuf,lpPix; LPBITMAPINFO lpWrkBM; int i,j,iLength; HANDLE fh; if (lpDIB!=NULL) /* 以前確保したバッファを解放 */ GlobalFree(lpDIB); fh=CreateFile(lpszFn,GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); /* ファイルオープン */ lpBuf=(LPBYTE)GlobalAlloc (GPTR,GetFileSize(fh,NULL)); /* バッファ確保 */ ReadFile(fh,lpBuf,GetFileSize(fh,NULL),&dummy,NULL); lpWrkBM=(LPBITMAPINFO)(lpBuf+sizeof(BITMAPFILEHEADER)); offset=*(LPDWORD)(lpBuf+10); lpPix=lpBuf+offset; /* ビットマップバッファの先頭アドレス */ CloseHandle(fh); /* 24ビットフルカラービットマップでなければ無効 */ if (lpBuf[0]!='B' || lpWrkBM->bmiHeader.biBitCount!=24) { GlobalFree(lpBuf); MessageBox(hwMain,"このファイルは使えません。","エラー",MB_OK); return FALSE; } /* ビットマップの大きさ保存 */ iWidth=lpWrkBM->bmiHeader.biWidth; iHeight=lpWrkBM->bmiHeader.biHeight; if (iWidth % 4==0) /* バッファの1ラインの長さを計算 */ iLength=iWidth*3; else iLength=iWidth*3+(4-(iWidth*3) % 4); lpDIB=GlobalAlloc(GPTR,sizeof(BITMAPINFO)+iWidth*iHeight*4); lpbiInfo=(LPBITMAPINFO)lpDIB; lpPixel=(LPDWORD)(lpDIB+sizeof(BITMAPINFO)); lpbiInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); lpbiInfo->bmiHeader.biWidth=iWidth; lpbiInfo->bmiHeader.biHeight=iHeight; lpbiInfo->bmiHeader.biPlanes=1; lpbiInfo->bmiHeader.biBitCount=32; lpbiInfo->bmiHeader.biCompression=BI_RGB; for (i=0;i=0 && j+l=0 && i+k> 16; g+=(lpPixel[(j+l)+(i+k)*iWidth] & 0x0000ff00) >> 8; b+=lpPixel[(j+l)+(i+k)*iWidth] & 0x000000ff; v++; } r/=v; g/=v; b/=v; lpWrk1[j+i*iWidth]=(r << 16)+(g << 8)+b; } for (i=0;i> 16; g1=(lpPixel[j+i*iWidth] & 0x0000ff00) >> 8; b1=lpPixel[j+i*iWidth] & 0x000000ff; r2=(lpWrk1[j+i*iWidth] & 0x00ff0000) >> 16; g2=(lpWrk1[j+i*iWidth] & 0x0000ff00) >> 8; b2=lpWrk1[j+i*iWidth] & 0x000000ff; dr=r1-r2; dg=g1-g2; db=b1-b2; r=128+dr*2; g=128+dg*2; b=128+db*2; if (r<0) r=0; if (r>255) r=255; if (g<0) g=0; if (g>255) g=255; if (b<0) b=0; if (b>255) b=255; lpPixel[j+i*iWidth]=(r << 16)+(g << 8)+b; } GlobalFree(lpWrk1); }