Array ( )
Вход:




Главная | OpenGL | GLSL | AI | Сеть | Примеры | Библиотека

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"! Ничего сложного, верно?





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




Комментарии:

Войдите, чтобы оставить комментарий:












Яндекс.Метрика
 Яндекс цитирования.