首页 > 代码库 > [游戏学习29] Win32 图像处理1

[游戏学习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 //============================================================================================