728x90
반응형
< 영상처리>
비트맵파일을 읽은 후 출력, 메모리 할당 받은 후 출력 및 180도 회전하여 출력하기.
- 소스만 먼저 올립니다. -
비트맵파일을 읽은 후 출력, 메모리 할당 받은 후 출력 및 180도 회전하여 출력하기.
- 소스만 먼저 올립니다. -
1 | |
2 | #include<Windows.h> |
3 | #include"vfw.h" |
4 | #include <math.h> |
5 | #include <iostream> |
6 | |
7 | |
8 | #pragma comment(lib, "vfw32.lib") //vfw32 라이브러리 포함 |
9 | |
10 | /********** 4의 배수로 맞춰주기 위한 변수 선언 **************************************/ |
11 | #define WIDTH4(width) ((width+3)>>2)<<2 |
12 | |
13 | #define ID_BCAPTURE 101 |
14 | |
15 | LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); |
16 | LRESULT CALLBACK FramInfo(HWND, LPVIDEOHDR); // 콜백 함수 |
17 | |
18 | TCHAR str[10]; //정수데이터값 확인을 위한 버퍼 |
19 | unsigned char Menuflag; //인터페이스 선택 |
20 | |
21 | HINSTANCE g_hInst; |
22 | HWND hWndMain; |
23 | HWND hVFW; |
24 | HWND Hwndmain; |
25 | HBITMAP hBit; |
26 | BITMAPINFO Bm; //비트맵 정보를 가짐 |
27 | |
28 | //영상 메모리 |
29 | int Action; |
30 | |
31 | LPCTSTR lpszClass = TEXT("VFW 기본 예제"); |
32 | |
33 | BYTE *imageData; |
34 | BITMAPFILEHEADER bmfh; |
35 | BITMAPINFO *binfo; |
36 | BYTE *cpyData; |
37 | BYTE *reData; |
38 | |
39 | |
40 | int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance |
41 | ,LPSTR lpszCndParam, int nCmdShow) |
42 | { |
43 | HWND hWnd; |
44 | MSG Message; |
45 | WNDCLASS WndClass; |
46 | g_hInst = hInstance; |
47 | |
48 | WndClass.cbClsExtra = 0; |
49 | WndClass.cbWndExtra = 0; |
50 | WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); |
51 | WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
52 | WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); |
53 | WndClass.hInstance = hInstance; |
54 | WndClass.lpfnWndProc = WndProc; |
55 | WndClass.lpszClassName = lpszClass; |
56 | WndClass.lpszMenuName = NULL; |
57 | WndClass.style = CS_HREDRAW|CS_VREDRAW; |
58 | |
59 | RegisterClass(&WndClass); |
60 | |
61 | //영상을 보여줄 윈도우 생성 |
62 | hWnd = CreateWindow(lpszClass, lpszClass,WS_OVERLAPPEDWINDOW|WS_CAPTION,200,200, |
63 | 300, 300, NULL, (HMENU)NULL, hInstance, NULL); |
64 | |
65 | hWndMain = hWnd; |
66 | ShowWindow(hWnd, SW_SHOW); |
67 | |
68 | while(GetMessage(&Message, 0,0,0)) |
69 | { |
70 | TranslateMessage(&Message); |
71 | DispatchMessage(&Message); |
72 | } |
73 | return (int)Message.wParam; |
74 | |
75 | } |
76 | |
77 | |
78 | |
79 | LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) |
80 | { |
81 | HDC Hdc; |
82 | FILE *file; |
83 | LONG width, height; |
84 | int count=0; |
85 | int width4; |
86 | switch(iMessage) |
87 | { |
88 | case WM_CREATE: |
89 | { |
90 | |
91 | Hwndmain = hWnd; |
92 | |
93 | Hdc = GetDC(hWnd); |
94 | |
95 | file=fopen("5.bmp","rb"); |
96 | |
97 | |
98 | |
99 | if(file==NULL) |
100 | return 0; |
101 | |
102 | |
103 | //BITMAPINFO |
104 | binfo = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD)*256)); |
105 | //초기화 |
106 | memset(binfo,0,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256); |
107 | //이미지 데이터가 보관될 메모리 할당 |
108 | |
109 | |
110 | //비트맵 파일 헤더 읽음 |
111 | fread(&bmfh,sizeof(BITMAPFILEHEADER),1,file); |
112 | //비트맵 인포 헤더를 읽음 |
113 | fread(&(binfo->bmiHeader),sizeof(BITMAPINFOHEADER),1,file); |
114 | |
115 | imageData = (BYTE*)malloc(binfo->bmiHeader.biSizeImage); |
116 | //이미지 데이터를 읽음 |
117 | fread(imageData,sizeof(BYTE),binfo->bmiHeader.biSizeImage,file); |
118 | |
119 | fclose(file); |
120 | |
121 | /**************메모리 동적할당 하여 비트맵 복사 ******************************/ |
122 | |
123 | cpyData = (BYTE*)malloc(binfo->bmiHeader.biSizeImage); // 메모리 동적할당. |
124 | width4=binfo->bmiHeader.biWidth*3; |
125 | //width4=WIDTH4(width4); //4의 배수로 비트맵 크기를 맞추는 작업. |
126 | for(height=0; height<binfo->bmiHeader.biHeight;height++) |
127 | { |
128 | for(width=0; width<binfo->bmiHeader.biWidth;width++) |
129 | { |
130 | cpyData[(height*width4)+width*3]= |
131 | imageData[(height*width4)+width*3]; |
132 | |
133 | cpyData[(height*width4)+width*3+1]= |
134 | imageData[(height*width4)+width*3+1]; |
135 | |
136 | cpyData[(height*width4)+width*3+2]= |
137 | imageData[(height*width4)+width*3+2]; |
138 | } |
139 | } |
140 | |
141 | /*********************비트맵 정보 180도 회전하여 복사*********************************/ |
142 | |
143 | reData = (BYTE*)malloc(binfo->bmiHeader.biSizeImage); |
144 | for(height=0; height<binfo->bmiHeader.biHeight;height++) |
145 | { |
146 | for(width=0; width<binfo->bmiHeader.biWidth;width++) |
147 | { |
148 | reData[(height*width4)+width*3]= |
149 | imageData[((binfo->bmiHeader.biHeight-height-1)*width4) |
150 | +(binfo->bmiHeader.biWidth-width-1)*3]; |
151 | reData[(height*width4)+width*3+1]= |
152 | imageData[((binfo->bmiHeader.biHeight-height-1)*width4) |
153 | +(binfo->bmiHeader.biWidth-width-1)*3+1]; |
154 | reData[(height*width4)+width*3+2]= |
155 | imageData[((binfo->bmiHeader.biHeight-height-1)*width4) |
156 | +(binfo->bmiHeader.biWidth-width-1)*3+2]; |
157 | } |
158 | } |
159 | /******************************************************************************************/ |
160 | |
161 | return 0; |
162 | } |
163 | case WM_COMMAND: |
164 | return 0; |
165 | case WM_LBUTTONDOWN:{ |
166 | |
167 | width = (unsigned int)binfo->bmiHeader.biWidth; |
168 | height = (unsigned int)binfo->bmiHeader.biHeight; |
169 | |
170 | |
171 | Hdc = GetDC(hWnd); |
172 | |
173 | MoveWindow(hWndMain,100,100,width*3,height+35,true); |
174 | |
175 | SetDIBitsToDevice(Hdc,0,0,width,height, |
176 | NULL,NULL,NULL,height,imageData, |
177 | binfo,DIB_RGB_COLORS); |
178 | if(cpyData!=NULL){ |
179 | SetDIBitsToDevice(Hdc,width,0,width,height, |
180 | NULL,NULL,NULL,height,cpyData, |
181 | binfo,DIB_RGB_COLORS); |
182 | } |
183 | if(reData!=NULL){ |
184 | SetDIBitsToDevice(Hdc,width*2,0,width,height, |
185 | NULL,NULL,NULL,height,reData, |
186 | binfo,DIB_RGB_COLORS); |
187 | } |
188 | ReleaseDC(hWnd,Hdc); |
189 | return 0;} |
190 | case WM_DESTROY: |
191 | if(cpyData!=NULL){ |
192 | free(cpyData); |
193 | cpyData=NULL; |
194 | } |
195 | if(imageData!=NULL){ |
196 | free(imageData); |
197 | imageData =NULL; |
198 | } |
199 | free(binfo); |
200 | free(cpyData); |
201 | free(reData); |
202 | PostQuitMessage(0); |
203 | return 0; |
204 | } |
205 | return (DefWindowProc(hWnd,iMessage,wParam,lParam)); |
206 | } |
207 |
728x90
'코스웨어 > 10년 시스템제어' 카테고리의 다른 글
2번 김동수~~~ 업무일지~~(영상, 자바) (0) | 2010.06.24 |
---|---|
RFID 프로젝트 <출입국 관리 시스템> - 신관식, 김락영, 김진웅, 배정훈 (0) | 2010.06.16 |
[시스템제어] 6월9일 업무일지_2 20번 이창민 (0) | 2010.06.11 |
시스템제어 6월10일 보고서 (0) | 2010.06.11 |
[시스템제어] 19번 이상은 (0) | 2010.06.08 |
6월 4일 보고서 17번 유성민 (1) | 2010.06.04 |
시스템제어-안태민(16번)_6월3일 (0) | 2010.06.03 |
네트워크 프로젝트 (0) | 2010.06.03 |