[游戏学习29] Win32 图像处理1

 

>_<:bmp格式的简单处理:

[游戏学习29] Win32 图像处理1  [游戏学习29] Win32 图像处理1  [游戏学习29] Win32 图像处理1  [游戏学习29] Win32 图像处理1  [游戏学习29] Win32 图像处理1

>_<:变暗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 //============================================================================================

 

你可能感兴趣的:(Win32)