[VC + + 기술 잡담 006] 컴퓨터 데스크 톱 을 캡 처 하여 bmp 그림 으로 저장 합 니 다.
16120 단어 vc++
1. Bmp 이미지 파일 구성
Bmp 는 Windows 운영 체제 의 표준 이미지 파일 형식 입 니 다.
Bmp 이미지 파일 은 네 부분 으로 구성 되 어 있 습 니 다.
(1) 비트 맵 헤더 파일 데이터 구 조 는 Bmp 이미지 파일 의 유형, 파일 크기 등 정 보 를 포함 합 니 다.
(2) 비트 맵 정보 데이터 구 조 는 Bmp 이미지 의 너비, 높이, 압축 유형 등 정 보 를 포함한다.
(3) 색상 표, 이 부분 은 선택 할 수 있 고 비트 맵 이 필요 하 며 비트 맵 (예 를 들 어 24 비트 컬러 비트 맵) 이 필요 하지 않 습 니 다.
(4) 비트 맵 데이터.
1.1 비트 맵 헤더 파일 데이터 구조
비트 맵 헤더 파일 데이터 구 조 는 Bmp 이미지 파일 의 형식, 파일 크기 등 정 보 를 포함 하고 14 개의 바이트 를 차지한다.그 구조 정 의 는 다음 과 같다.
1 typedef struct tagBITMAPFILEHEADER {
2 WORD bfType; // ( BM)
3 DWORD bfSize; //
4 WORD bfReserved1; //
5 WORD bfReserved2; //
6 DWORD bfOffBits; //
7 } BITMAPFILEHEADER;
그 중에서 bfType 은 비트 맵 유형 을 나타 내 는데 반드시 BM 이 어야 한다.bfReserved 1 과 bfReserved 2 는 비트 맵 보존 글자 로 0 이 어야 합 니 다.bfOffBits 는 파일 헤드 의 편 이 량 을 표시 하고 비트 맵 데이터 의 시작 위치 도 표시 합 니 다.
1.2 비트 맵 정보 데이터 구조
비트 맵 정보 데이터 구 조 는 비트 맵 의 크기 등 정 보 를 설명 하 는 데 사용 되 며 40 개의 바이트 를 차지한다.그 구조 정 의 는 다음 과 같다.
1 typedef struct tagBITMAPINFOHEADER{
2 DWORD biSize; //
3 LONG biWidth; //
4 LONG biHeight; //
5 WORD biPlanes; //
6 WORD biBitCount; //
7 DWORD biCompression; // (0 )
8 DWORD biSizeImage; //
9 LONG biXPelsPerMeter; //
10 LONG biYPelsPerMeter; //
11 DWORD biClrUsed; //
12 DWORD biClrImportant; //
13 } BITMAPINFOHEADER;
그 중에서 biWidth 와 biHeight 는 비트 맵 의 너비 와 비트 맵 의 높이 를 나타 내 고 균일 한 픽 셀 을 단위 로 한다.biPlanes 는 팔레트 의 수량 을 1 로 표시 합 니 다.biBitCount 는 픽 셀 마다 필요 한 자릿수 를 표시 합 니 다. 그 값 은 1 (2 색), 4 (16 색), 8 (256 색), 16 (하 이 컬러) 또는 24 (리 얼 컬러) 여야 합 니 다.biCompression 은 비트 맵 압축 형식 을 표시 합 니 다. 그 값 은 0 (압축 하지 않 음), 1 (BI RLE 8 압축) 또는 2 (BI RLE 4 압축) 여야 합 니 다.
1.3 색 표
색상 표 는 비트 맵 의 색상 을 설명 하 는 데 사 용 됩 니 다. 몇 개의 표 항목 이 있 습 니 다. 각 표 항목 은 RGBQUAD 형식의 구조 체 로 색상 을 정의 합 니 다.RGBQUAD 구조 체 의 정 의 는 다음 과 같다.
1 typedef struct tagRGBQUAD {
2 BYTE rgbBlue; //
3 BYTE rgbGreen; //
4 BYTE rgbRed; //
5 BYTE rgbReserved; //
6 } RGBQUAD;
색상 표 에 있 는 RGBQUAD 구조 데이터 의 개 수 는 biBitCount 에 의 해 정 해 집 니 다. biBitCount 가 1, 4, 8 일 때 각각 2, 16, 256 개의 표 항목 이 있 고 biBitCount 가 24 일 때 색상 표 항목 이 없습니다.
1.4 비트 맵 데이터
비트 맵 데 이 터 는 비트 맵 의 모든 픽 셀 값 을 기록 합 니 다. 기록 순 서 는 스 캔 줄 에서 왼쪽 에서 오른쪽으로, 스 캔 줄 사이 에서 아래 에서 위로 입 니 다.biBitCount 가 1 일 때 8 개의 픽 셀 이 1 개의 바이트 를 차지한다.biBitCount 가 4 일 때 2 개의 픽 셀 이 1 개의 바이트 를 차지한다.biBitCount 가 8 일 때 1 개의 픽 셀 이 1 개의 바이트 를 차지한다.biBitCount 가 24 일 때 1 개의 픽 셀 이 3 개의 바이트 (순서 B, G, R) 를 차지한다.
2. 프로 그래 밍 예시
컴퓨터 데스크 톱 을 캡 처 하고 bmp 그림 으로 저장 하 는 방법 을 보 여 줍 니 다.
1 /*
2 * : bmp
3 * :
4 * :
5 */
6 void CCopyScreenDlg:: CopyScreenToBitmap ()
7 {
8 //
9 CDC screenDC;
10 screenDC.CreateDC("DISPLAY", NULL, NULL, NULL);
11
12 //
13 CBitmap bmp;
14 int nWidth = GetSystemMetrics(SM_CXSCREEN); //
15 int nHeight = GetSystemMetrics(SM_CYSCREEN); //
16 bmp.CreateCompatibleBitmap(&screenDC, nWidth, nHeight);
17
18 //
19 CDC memDC;
20 memDC.CreateCompatibleDC(&screenDC);
21 memDC.SelectObject(&bmp);
22 memDC.BitBlt(0, 0, nWidth, nHeight, &screenDC, 0, 0, SRCCOPY);
23
24 //
25 BITMAP bm;
26 bmp.GetBitmap(&bm);
27 DWORD bmSize = bm.bmWidthBytes*bm.bmHeight; //
28 LPSTR bmData = (LPSTR)GlobalAlloc(GPTR, bmSize); //
29
30 //
31 BITMAPFILEHEADER hdr;
32 hdr.bfType = (WORD)('M'<<8)|'B'; // ( BM)
33 hdr.bfSize = 54+bmSize; //
34 hdr.bfReserved1 = 0; //
35 hdr.bfReserved2 = 0; //
36 hdr.bfOffBits = 54; //
37
38 //
39 BITMAPINFOHEADER bmpInfoHdr;
40 bmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER); //
41 bmpInfoHdr.biWidth = bm.bmWidth; //
42 bmpInfoHdr.biHeight = bm.bmHeight; //
43 bmpInfoHdr.biPlanes = bm.bmPlanes; //
44 bmpInfoHdr.biBitCount = bm.bmBitsPixel; //
45 bmpInfoHdr.biCompression = 0; // (0 )
46 bmpInfoHdr.biSizeImage = bmSize; //
47 bmpInfoHdr.biXPelsPerMeter = 0; //
48 bmpInfoHdr.biYPelsPerMeter = 0; //
49 bmpInfoHdr.biClrUsed = 0; //
50 bmpInfoHdr.biClrImportant = 0; //
51
52 // RGB
53 GetDIBits(screenDC, bmp, 0, bmpInfoHdr.biHeight, bmData, (BITMAPINFO*)&bmpInfoHdr, DIB_RGB_COLORS);
54
55 // bmp
56 CFile file;
57 if(file.Open("temp.bmp", CFile::modeCreate|CFile::modeWrite))
58 {
59 file.WriteHuge(&hdr, sizeof(BITMAPFILEHEADER)); //
60 file.WriteHuge(&bmpInfoHdr, sizeof(BITMAPINFOHEADER)); //
61 file.WriteHuge(bmData, bmSize); //
62 file.Close();
63 }
64 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
VC++6.0 동적 라이브러리 생성 및 호출(MFC가 아닌 dll)텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.