[游戏学习29] Win32 图像处理1
>_<:bmp格式的简单处理:
>_<:变暗RGB同时除以某一值
>_<:出现轮廓的是通道相减
>_<:最后一个是颜色提取
>_<:头文件参见:http://www.cnblogs.com/zjutlitao/p/3733164.html
1 #include "stdafx.h" 2 #include "resourse.h" 3 4 #define MAX_LOADSTRING 100 5 6 // Global Variables: 7 HINSTANCE hInst; // current instance 8 TCHAR szTitle[MAX_LOADSTRING]; // The title bar text 9 TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text 10 HBITMAP bg,dra; 11 HDC mdc; 12 13 const int xstart=50; 14 const int ystart=20; 15 // Foward declarations of functions included in this code module: 16 ATOM MyRegisterClass(HINSTANCE hInstance); 17 BOOL InitInstance(HINSTANCE, int); 18 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 19 LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); 20 void MyPaint(HDC hdc); 21 //======================================================================================== 22 int APIENTRY WinMain(HINSTANCE hInstance, 23 HINSTANCE hPrevInstance, 24 LPSTR lpCmdLine, 25 int nCmdShow) 26 { 27 // TODO: Place code here. 28 MSG msg; 29 30 MyRegisterClass(hInstance);//调用函数向系统注册窗口类别,输入参数hInstance是目前运行程序的对象代码; 31 32 // 调用InitInstance函数,进行初始化操作; 33 if (!InitInstance (hInstance, nCmdShow)) 34 { 35 return FALSE; 36 } 37 38 // 消息循环(通过消息循环来获取信息, 39 //进行必要的键盘信息转换而后将控制权交给操作系统, 40 //有操作系统决定哪个程序的消息处理函数处理消息 41 while (GetMessage(&msg, NULL, 0, 0)) //获取程序消息 42 { 43 TranslateMessage(&msg);//转换伪码及字符 44 DispatchMessage(&msg);//将控制权交给系统,再有系统决定负责处理消息的程序; 45 } 46 47 return msg.wParam; 48 } 49 //===================================================================================== 50 51 52 53 //============================================================================================= 54 //在建立程序窗口实体之前,必须先定义一个窗口类别,其中包含所要建立窗口的信息, 55 //并向系统注册,这里的MyRegisterClass函数就是进行定义及注册窗口类别的函数。 56 //============================================================================================== 57 ATOM MyRegisterClass(HINSTANCE hInstance) 58 { 59 WNDCLASSEX wcex; //申请一个窗口类别“WNDCLASSEX”和结构”wcex“ 60 //-------------------------------------------------------------- 61 //定义vcex结构的各项信息,其中设定信息处理函数(lpfnWndProc) 62 //为WNDPROC,类别名称为(lpszClassName)为”fe"; 63 //-------------------------------------------------------------- 64 wcex.cbSize = sizeof(WNDCLASSEX); 65 66 wcex.style = CS_HREDRAW | CS_VREDRAW; 67 wcex.lpfnWndProc = (WNDPROC)WndProc; 68 wcex.cbClsExtra = 0; 69 wcex.cbWndExtra = 0; 70 wcex.hInstance = hInstance; 71 wcex.hIcon = NULL; 72 wcex.hCursor = NULL; 73 wcex.hCursor = LoadCursor(NULL,IDC_ARROW); 74 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 75 wcex.lpszMenuName = NULL; 76 wcex.lpszClassName = "fe"; 77 wcex.hIconSm = NULL; 78 79 return RegisterClassEx(&wcex);//调用RegisterClassEx函数注册类别,返回一个“ATOM"形态的字符串 80 //此字符串即为类别名称”fe"; 81 } 82 //============================================================================================ 83 84 85 //============================================================================================ 86 //按照前面所定义的窗口类别来建立并显示实际的程序窗口 87 //============================================================================================ 88 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 89 { 90 HWND hWnd; 91 HDC hdc; 92 hInst = hInstance; // 把instance handle 储存在全局变量中; 93 94 hWnd = CreateWindow("fe","绘图窗口",WS_OVERLAPPEDWINDOW, 95 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 96 //----------------------------------------------- 97 //调用CreateWindow函数来建立一个窗口对象 98 //第一个参数就是窗口建立依据的类别名称 99 //----------------------------------------------- 100 if (!hWnd) 101 { 102 return FALSE; 103 } 104 //------------------------------------------------ 105 //设定窗口的位置及窗口的大小,然后绘制显示在设备上 106 //------------------------------------------------- 107 MoveWindow(hWnd,10,10,600,450,true);//位置及大小 108 ShowWindow(hWnd, nCmdShow);//改定窗口显示时的状态 109 UpdateWindow(hWnd);//将窗口绘制在显示设备上 110 111 hdc=GetDC(hWnd); 112 mdc=CreateCompatibleDC(hdc); 113 114 BITMAP bm1; 115 unsigned char *px1; 116 117 bg=(HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,600,450,LR_LOADFROMFILE);//名、类型、大小、加载方式; 118 GetObject(bg,sizeof(BITMAP),&bm1); 119 px1=new unsigned char[bm1.bmHeight * bm1.bmWidthBytes]; 120 GetBitmapBits(bg,bm1.bmHeight*bm1.bmWidthBytes,px1); 121 122 123 int xend,yend; 124 int x,y,i; 125 int rgb_b; 126 int PxBytes=bm1.bmBitsPixel/8; 127 128 129 for(y=0;y<(bm1.bmHeight);y++) 130 { 131 for(x=0;x<bm1.bmWidth;x++) 132 { 133 rgb_b=y*bm1.bmWidthBytes+x*PxBytes; 134 135 if(px1[rgb_b]<160 && px1[rgb_b+1]<160 && px1[rgb_b+2]<160){ 136 px1[rgb_b+2]=0; 137 px1[rgb_b+1]=0; 138 px1[rgb_b]=0; 139 }else{ 140 px1[rgb_b+2]=254; 141 px1[rgb_b+1]=254; 142 px1[rgb_b]=254; 143 } 144 } 145 } 146 147 SetBitmapBits(bg,bm1.bmHeight*bm1.bmWidthBytes,px1); 148 149 MyPaint(hdc); 150 151 ReleaseDC(hWnd,hdc); 152 delete [] px1; 153 154 return TRUE; 155 } 156 //============================================================================================ 157 158 159 //============================================================================================ 160 // 161 //============================================================================================ 162 void MyPaint(HDC hdc) 163 { 164 SelectObject(mdc,bg); 165 BitBlt(hdc,0,0,1366,768,mdc,0,0,SRCCOPY);//在窗口位置、大小、原图剪切位 166 } 167 //============================================================================================ 168 169 170 //============================================================================================ 171 //在前面定义类别的时候把WndProc定义为消息处理函数(当某些外部消息发生时,会按消息的类型 172 //来决定该如何进行处理。此外该函数也是一个回叫函数(CALLBACK)(windows系统函数)每一个 173 //程序都会接收信息,选择性接受、处理; 174 //============================================================================================ 175 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 176 { 177 PAINTSTRUCT ps; 178 HDC hdc; 179 180 switch (message) //判断消息类型 181 { 182 case WM_PAINT: //窗口重绘制 183 hdc = BeginPaint(hWnd, &ps); 184 MyPaint(hdc); 185 EndPaint(hWnd, &ps); 186 break; 187 case WM_DESTROY: //处理窗口结束消息 188 DeleteDC(mdc); 189 DeleteObject(bg); 190 PostQuitMessage(0); 191 break; 192 default: 193 return DefWindowProc(hWnd, message, wParam, lParam); 194 } 195 return 0; 196 } 197 //============================================================================================