336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
학교 첫과제에서 단순한 그림판을 만드는 과제에서 기능으로 화면캡쳐를 하는 것을 구현하라고 하여 찾아봐도 없어서 
만들어 놓았다.
주석으로 BMP(BitMap) 파일 구조가 어떤 건지 작성했고, 이걸 이용하여 기능을 작성하였다.
opengl에서 사용할 때는 keyboard Callback으로 's' 키 에 작업을 할당해두고 화면 크기 만큼  화면을 캡쳐하여 bmp file로 저장한다.
부분 소스는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
void CaptureScreen()
{
    /*
    BMP(bitmap)의 구조
    비트맵파일헤더
    비트맵인포헤더
    팔레트
    이미지데이터
    typedef unsigned long       DWORD;
    typedef unsigned short      WORD;
    BYTE (=unsigned char) : 0~255
    CHAR (=signed char) : -128~127
    INT(=int) : 16 or 32 bit (machine dependent)
    INT8 (=signed char) : -128~127
    INT16 (=short) : -32768~32767
    INT32 (=long) : -2147483648~2147483647
    LONG (=long) : -2147483648~2147483647 (machine dependent)
    SHORT (=short) : -32768~32767
    TCHAR (=char or INT16) : 8bit or 16bit char, _UNICODE 정의에 따라 다름
    UINT (=unsigned int) : 16 or 32bit (0~65535:16bit) (machine dependent)
    UINT8 (=unsigned char) : 0~255
    UINT16 (=unsigned short) : 0~65535
    UINT32 (=unsigned long) : 0~4294967295
    ULONG (=unsigned long) : 0~4294967295 (machine dependent)
    USHORT (=unsigned short): 0~65535
    
    float : 3.4x10^-38 ~ 3.4x10^38    (유효숫자 7자리)
    double : 1.7x10^-308 ~ 1.7x10^308    (유효숫자 15자리)
    long double : 3.4x10^-4932 ~ 3.4x10^4932    (유효숫자 19자리)
    DWORD (=unsigned long) : 0~4294967295
    32비트 = 4바이트
    WORD = 2바이트
    typedef struct tagBITMAPFILEHEADER {
    v    WORD bfType;            //BM 이라고 써있으면 bmp
    v    DWORD bfSize;           //이미지 크기
        WORD bfReserved1;
        WORD bfReserved2;
    v    DWORD bfOffBits;      //이미지 데이터가 있는 곳의 포인터
    } BITMAPFILEHEADER
    14 = 4+2+4+4+2 
    typedef struct tagBITMAPINFOHEADER{
    v    DWORD biSize;          //현 구조체의 크기
    v    LONG biWidth;          //이미지의 가로 크기
    v    LONG biHeight;         //이미지의 세로 크기
    v    WORD biPlanes;        //플레인수
    v    WORD biBitCount     //비트 수
        DWORD biCompression;  //압축 유무
    v    DWORD biSizeImage;       //이미지 크기
        LONG biXPelsPerMeter;  //미터당 가로 픽셀
        LONG biYPelsPerMeter;  //미터당 세로 픽셀
        DWORD biClrUsed;         //컬러 사용 유무
        DWORD biClrImportant;  //중요하게 사용하는 색
    } BITMAPINFOHEADER;
    4+4+4+2+2+4+4+4+4+4+4
    = 40
    */
 
    BITMAPFILEHEADER bmpfile; // 비트맵파일헤더
    BITMAPINFOHEADER bmpinfo; // 비트맵정보헤더
 
    int Width, Height;
    Width = Height = 300;
 
    unsigned char *pixels    = new unsigned char[sizeof(unsigned char)*Width*Height*3]; //unsigned char = BYTE 0-255
    FILE *file    = fopen("capture.bmp""wb");
 
 
    glReadPixels( 00, Width, Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels );
 
    // void * memset ( void * ptr, int value, size_t num );
    // memset 메모리 블록을 채운다.  ptr로 시작하는 메모리 주소부터 num개의 바이트를 value 값으로 채움. 
    // 이때 value 는 unsigned char 형변환된다.
    // ptr ; 값을 채울 메모리의 시작 주소
    // value ; 채울 값. 인자로는 int 로 전달되지만 함수 내부적으로는 unsigned char 로 형변환 되어서 사용된다.
    // num ; value 로 채울 바이트 수
    // ptr 값이 리턴 
    /*
    int main ()
    {
        char str[] = "Hello, World!";
        memset (str,'-',6);
        puts (str);
        return 0;
    }
    일시에 출력은
    Hello, World!
    ------ World!
    */
 
    memset( &bmpfile, 0sizeof( bmpfile ) ); // 14바이트 0 값.
    memset( &bmpinfo, 0sizeof( bmpinfo ) ); // 
    printf("%d",sizeof( bmpfile ));
    bmpfile.bfType    = 'MB'
    bmpfile.bfSize    = sizeof(bmpfile)+sizeof(bmpinfo)+Width*Height*3;
    bmpfile.bfOffBits    = sizeof(bmpfile)+sizeof(bmpinfo); 
 
    bmpinfo.biSize    = sizeof(bmpinfo); // 구조체크기
    bmpinfo.biWidth    = Width; // 이미지 가로
    bmpinfo.biHeight    = Height; // 이미지 세로
    bmpinfo.biPlanes    = 1// 플레인수
    bmpinfo.biBitCount    = 24// 비트수 
    bmpinfo.biSizeImage    = Width*Height*3// 이미지의크기
 
    fwrite( &bmpfile, sizeof(bmpfile), 1, file );
    fwrite( &bmpinfo, sizeof(bmpinfo), 1, file );
    fwrite( pixels, sizeof(unsigned char), Height*Width*3, file );
 
    fclose( file );
 
    free( pixels );
}
cs

+ Recent posts