GDI操作BITMAP的基本编程方法

 1
 2 #ifndef _BITMAP_H
 3 #define _BITMAP_H
 4
 5 #include <windows.h>
 6
 7 void SaveImage(const char * bmp_file,void *rgb_data,int rgb_len,BITMAPINFOHEADER * bi);
 8 void  FillBitmapInfoHdr(BITMAPINFOHEADER * bi,int width,int height,int deep);
 9 bool  GetImageData( HWND target,RECT rect,void ** data,int * len);
10 bool GetImageData2( HWND target,RECT rect,void * data,int * len);
11 void CaptureImage(HWND target,const char * destfile);
12 void DrawBitmap(HWND hwnd,int width,int height,char *data,int deep);           
13 void DrawBitmap2(HWND hwnd,RECT rect,char *data,int deep);
14 void StretchDrawBitmap(HWND hwnd,int width,int height,char *data,int deep);
15 #endif
16   1 #include <windows.h>
  2 #include <stdio.h>
  3
  4 void SaveImage(const char * bmp_file,void *rgb_data,int rgb_len,BITMAPINFOHEADER * bi){      // 保存BITMAP为文件
  5     BITMAPFILEHEADER hdr;
  6     FILE *fsave;
  7     memset(&hdr,0,sizeof(hdr));
  8     hdr.bfType = ((WORD) ('M' << 8) | 'B');
  9     hdr.bfSize = sizeof(hdr)+sizeof(BITMAPINFOHEADER)+rgb_len;
 10     hdr.bfOffBits = (DWORD) (sizeof(hdr) + sizeof(BITMAPINFOHEADER) );
 11     //--
 12     fsave = fopen(bmp_file,"wb");
 13     fwrite( &hdr,sizeof(hdr),1,fsave);
 14     fwrite(bi,sizeof(BITMAPINFOHEADER),1,fsave);
 15     fwrite(rgb_data,rgb_len,1,fsave);
 16     fflush(fsave);
 17     fclose(fsave);
 18 }
 19
 20
 21 void FillBitmapInfoHdr(BITMAPINFOHEADER * bi,int width,int height,int deep){   // 填充BITMAP头信息
 22     memset(bi,0,sizeof(BITMAPINFOHEADER));
 23     bi->biSize                  = sizeof(BITMAPINFOHEADER);
 24     bi->biWidth                = width;
 25     bi->biHeight               = height;
 26     bi->biPlanes               = 1;
 27     bi->biBitCount           = deep;            //bm.bmPlanes * bm.bmBitsPixel;
 28     bi->biCompression     = BI_RGB;
 29     bi->biSizeImage         = 0;
 30     bi->biXPelsPerMeter    = 0;
 31     bi->biYPelsPerMeter    = 0;
 32     bi->biClrUsed             = 0;
 33     bi->biClrImportant      = 0;
 34 }
 35
 36 bool GetImageData2( HWND target,RECT rect,void * data,int * len){    // 获取HWND中的BITMAP信息
 37     HDC entireDC;
 38     RECT rc;
 39     HBITMAP bitmap;
 40     HDC CompDC;   
 41     entireDC = GetDC(target);
 42     //GetWindowRect(target,&rc);
 43     rc = rect;  
 44    
 45     if( rc.right-rc.left<=0 || rc.bottom-rc.top <=0){
 46         return false;
 47     }
 48     bitmap = CreateCompatibleBitmap( entireDC,rc.right-rc.left,rc.bottom-rc.top);
 49     if(bitmap ==NULL){
 50         ReleaseDC(target,entireDC);
 51         return false;
 52     }
 53     CompDC = CreateCompatibleDC(entireDC);
 54     SelectObject(CompDC,bitmap);   
 55     BitBlt(CompDC,0,0,rc.right-rc.left,rc.bottom-rc.top,entireDC,rect.left,rect.top,SRCCOPY);
 56
 57     BITMAPINFO bmi;
 58     BITMAPINFOHEADER   *bi;
 59     int rgb_len ;
 60     int lines;
 61     bi = &bmi.bmiHeader;
 62     char *rgb_buff ;
 63     FillBitmapInfoHdr(bi,rc.right-rc.left,rc.bottom-rc.top,24);
 64
 65     rgb_len = bi->biWidth * bi->biHeight * 3;
 66    
 67     rgb_buff =(char*) data;         // new char[rgb_len];
 68     if( rgb_buff == NULL ){
 69         return false;
 70     }
 71     lines = GetDIBits( CompDC,bitmap,0,rc.bottom-rc.top,rgb_buff,
 72                               (LPBITMAPINFO)bi,DIB_RGB_COLORS);
 73     DeleteObject(bitmap);
 74     ReleaseDC(target,CompDC);
 75     ReleaseDC(target,entireDC);
 76     DeleteDC(CompDC);
 77     if( lines == NULL){
 78       //  delete[] rgb_buff;
 79         return false;
 80     }
 81    // *data = rgb_buff;
 82     *len = rgb_len;
 83     return true;
 84 }
 85
 86
 87 bool GetImageData( HWND target,RECT rect,void ** data,int * len){    // 获取HWND中的BITMAP信息
 88     HDC entireDC;
 89     RECT rc;
 90     HBITMAP bitmap;
 91     HDC CompDC;   
 92     entireDC = GetDC(target);
 93     //GetWindowRect(target,&rc);
 94     rc = rect;   
 95     bitmap = CreateCompatibleBitmap( entireDC,rc.right-rc.left,rc.bottom-rc.top);
 96     CompDC = CreateCompatibleDC(entireDC);
 97     SelectObject(CompDC,bitmap);   
 98     BitBlt(CompDC,0,0,rc.right-rc.left,rc.bottom-rc.top,entireDC,0,0,SRCCOPY);
 99
100     BITMAPINFO bmi;
101     BITMAPINFOHEADER   *bi;
102     int rgb_len ;
103     int lines;
104     bi = &bmi.bmiHeader;
105     char *rgb_buff ;
106     FillBitmapInfoHdr(bi,rc.right-rc.left,rc.bottom-rc.top,24);
107
108     rgb_len = bi->biWidth * bi->biHeight * 3;
109     rgb_buff = new char[rgb_len];
110     if( rgb_buff == NULL ){
111         return false;
112     }
113     lines = GetDIBits( CompDC,bitmap,0,rc.bottom-rc.top,rgb_buff,
114                              (LPBITMAPINFO)bi,DIB_RGB_COLORS);
115     DeleteObject(bitmap);
116     ReleaseDC(target,CompDC);
117     ReleaseDC(target,entireDC);
118     DeleteDC(CompDC);
119     if( lines == NULL){
120         delete[] rgb_buff;
121         return false;
122     }
123     *data = rgb_buff;
124     *len = rgb_len;
125     return true;
126 }
127
128
129

130 void CaptureImage(HWND target,const char * destfile){   // 获取HWND的BITMAP为文件
131     RECT rc;
132     GetWindowRect(target,&rc);
133     void *data;
134     int len;
135     GetImageData(target,rc,&data,&len);
136
137     BITMAPINFO bmi;
138     BITMAPINFOHEADER   *bi;     
139     bi = &bmi.bmiHeader;
140     FillBitmapInfoHdr(bi,rc.right-rc.left,rc.bottom-rc.top,24);
141
142     SaveImage(destfile,data,len,bi);
143    
144     delete[] data;
145 }
146
147 void DrawBitmap2(HWND hwnd,RECT rect,char *data,int deep)  // 在HWND中绘制BITMAP
148 {
149     BITMAPINFOHEADER   *bi;
150     BITMAPINFO bitmap;
151     bi = &bitmap.bmiHeader;
152     memset(&bitmap,0,sizeof(bitmap));
153     bi->biSize                 = sizeof(BITMAPINFOHEADER);
154     bi->biWidth               = rect.right - rect.left;
155     bi->biHeight              = rect.bottom - rect.top;
156     bi->biPlanes              = 1;
157     bi->biBitCount           = deep;            //bm.bmPlanes * bm.bmBitsPixel;
158     bi->biCompression     = BI_RGB;
159     bi->biSizeImage         = bi->biWidth*bi->biHeight*deep/3;
160     bi->biXPelsPerMeter    = 0;
161     bi->biYPelsPerMeter    = 0;
162     bi->biClrUsed            = 0;
163     bi->biClrImportant     = 0;
164
165     HDC hdc =   GetDC(hwnd);
166
167     StretchDIBits( hdc,
168         rect.left,
169         rect.top,
170         rect.right-rect.left,
171         rect.bottom - rect.top,
172         //rc.right-1,
173         //rc.bottom-1,
174         0,
175         0,
176         rect.right-rect.left,
177         rect.bottom - rect.top,
178         (CONST VOID *)data,
179         &bitmap,
180         DIB_RGB_COLORS,
181         SRCCOPY );
182
183     //ReleaseDC(hwnd,hdc);
184     ReleaseDC(hwnd,hdc);
185 }
186
187 void StretchDrawBitmap(HWND hwnd,int width,int height,char *data,int deep)  // 在HWND中绘制BITMAP
188 {   
189     BITMAPINFOHEADER   *bi;
190     BITMAPINFO bitmap;
191     bi = &bitmap.bmiHeader;
192     memset(&bitmap,0,sizeof(bitmap));
193     bi->biSize        = sizeof(BITMAPINFOHEADER);
194     bi->biWidth        = width;
195     bi->biHeight         = height;
196     bi->biPlanes         = 1;
197     bi->biBitCount        = deep;            //bm.bmPlanes * bm.bmBitsPixel;
198     bi->biCompression    = BI_RGB;
199     bi->biSizeImage        = bi->biWidth*bi->biHeight*deep/3;
200     bi->biXPelsPerMeter    = 0;
201     bi->biYPelsPerMeter    = 0;
202     bi->biClrUsed        = 0;
203     bi->biClrImportant    = 0;
204     RECT rc;
205     HDC hdc =   GetDC(hwnd);
206     ::GetWindowRect(hwnd,&rc);
207     StretchDIBits( hdc,
208         0,
209         0,
210         rc.right - rc.left,
211         rc.bottom - rc.top,
212         0,
213         0,
214         width,
215         height,
216         (CONST VOID *)data,
217         &bitmap,
218         DIB_RGB_COLORS,
219         SRCCOPY );
220    
221     //ReleaseDC(hwnd,hdc);
222     ReleaseDC(hwnd,hdc);
223 }
224
225 void DrawBitmap(HWND hwnd,int width,int height,char *data,int deep)  // 在HWND中绘制BITMAP
226 {
227     BITMAPINFOHEADER   *bi;
228     BITMAPINFO bitmap;
229     bi = &bitmap.bmiHeader;
230     memset(&bitmap,0,sizeof(bitmap));
231     bi->biSize                 = sizeof(BITMAPINFOHEADER);
232     bi->biWidth              = width;
233     bi->biHeight              = height;
234     bi->biPlanes               = 1;
235     bi->biBitCount           = deep;            //bm.bmPlanes * bm.bmBitsPixel;
236     bi->biCompression     = BI_RGB;
237     bi->biSizeImage         = width*height*deep;
238     bi->biXPelsPerMeter    = 0;
239     bi->biYPelsPerMeter    = 0;
240     bi->biClrUsed             = 0;
241     bi->biClrImportant     = 0;
242
243     HDC hdc =   GetDC(hwnd);
244
245     StretchDIBits( hdc,
246         0,
247         0,
248         width-1,
249         height-1,
250         //rc.right-1,
251         //rc.bottom-1,
252         0,
253         0,
254         width,
255         height,
256         (CONST VOID *)data,
257         &bitmap,
258         DIB_RGB_COLORS,
259         SRCCOPY );
260
261     //ReleaseDC(hwnd,hdc);
262     ReleaseDC(hwnd,hdc);
263 }

posted @ 2009-04-14 10:12  Kane_BJ  阅读(659)  评论(0)    收藏  举报