OpenGL: Скриншот средствами OpenGL

Этот урок покажет вам, как научить ваши программы сохранять скриншоты в .tga-файлы.
Я выбрал формат .tga, так как он очень прост и для загрузки, и для записи в него.

Исходники можно взять из любого урока. Ну, например, из второго: «рисование примитивов».
Нам нужно только чтобы на экране была какая-нибуть фигура.

Редактируем файл main.cpp:

////////////////////////////////////////////////////////////////////////////
//
//         Вверху файла опишем новую функцию, которая собственно и будет
//      делать скриншоты.
//
////////////////////////////////////////////////////////////////////////////void MakeScreenShot()
{
// Массив данных будущего изображения
unsigned char *output = 0;// Выделяем необходимую память: ширина*высота*3 цветовых бита
output = new unsigned char[SCREEN_WIDTH * SCREEN_HEIGHT * 3];

// Для получения данных экрана используем функцию glReadPixels:
glReadPixels(0,0, SCREEN_WIDTH, SCREEN_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE,
output);

//
// Теперь нужно записать полученные данные в файл Screen.tga.
//

FILE *sFile = 0;        // Дескриптор файла

// Обьявляем переменные, которые понадобятся нам в дальнейшем:
unsigned char tgaHeader[12] = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0};
unsigned char header[6];
unsigned char bits = 0;
int colorMode = 0;
unsigned char tempColors = 0;

// Открываем файл скриншота
sFile = fopen(«Screen.tga», «wb»);

// Проверяем, правильно ли произошло открытие
if(!sFile){
MessageBox(NULL, «Can't open ScreenShot File!»,«Error»,MB_OK);
return;
}

// Устанавливаем цветовой режим и глубину цвета:
colorMode = 3;
bits = 24;

// Записываем ширину и высоту:
header[0] = SCREEN_WIDTH % 256;
header[1] = SCREEN_WIDTH / 256;
header[2] = SCREEN_HEIGHT % 256;
header[3] = SCREEN_HEIGHT / 256;
header[4] = bits;
header[5] = 0;

// Записываем хидеры в начало файла:
fwrite(tgaHeader, sizeof(tgaHeader), 1, sFile);
fwrite(header, sizeof(header), 1, sFile);

// Поскольку в формате TGA цвета хранятся не в RGB, а в BRG, нам нужно
// поменять местами наши данные:
for(int i=0; i < SCREEN_WIDTH * SCREEN_HEIGHT * colorMode; i+=colorMode)
{
tempColors = output[i];
output[i] = output[i+2];
output[i+2] = tempColors;
}

// Записываем данные изображения:
fwrite(output, SCREEN_WIDTH * SCREEN_HEIGHT * colorMode, 1, sFile);

// Закрываем файл
fclose(sFile);
// Удаляем ненужные теперь данные
delete[] output;
}

//////////////////////////////////////////////////////////////////////////////////
//
//        И добавим обработку клавиши 's' в блок «case WM_KEYDOWN:»
//
//////////////////////////////////////////////////////////////////////////////////

case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:     // Если нажат ESCAPE
PostQuitMessage(0); // Выходим
break;
case 'S':
MakeScreenShot();
break;
}
break;

 

Вот и всё! Теперь, нажав 'S' в вашей программе, в папке с exe-шником появится скриншот
под названием «Screen.tga»! Ничего сложного, верно?

Исходные коды к уроку

Понравилась статья? Поделиться с друзьями: