Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для uLong
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138

Объясните алгоритм создания и сохранения скришота в OpenGL

05.07.2015, 14:44. Показов 1013. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Начал понемногу разбирать импорт / экспорт изображений в OpenGL. Для начала решил понять эти алгоритмы и написать простой "скриншотер" с окна OpenGL, но как бывает у новичков: "Тупо просидел 40 минут и не знал с чего начать". Я натолкнулся в интернете на код, которые позволяет делать скришот и сохранять в папке с проектом в формате *.tga. Найти код можно, но нужно его понять.
Поясните мне пожалуйста алгоритм перевода в изображения *.tga, это единственное, что я не понял. Можно также об переводах в разные форматы изображения в общем.
Для чего header, что за colorMode, bits, tgaHeader. Желательно как можно подробнее, пожалуйста, очень нужно. В качестве дополнения подойдут также всевозможные статьи по конвертации изображений, записи в изображение TGA и т.д.

C++
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
bool MakeScreenShot()
{
    unsigned char* output = 0; //Результат
    
        //Размеры
        const int WIDTH = 512; 
    const int HEIGHT = 512;
 
        //Инициализация массива. Здесь мне неясно, почему мы умножаем ещё и на 3. 
    output = new unsigned char[WIDTH * HEIGHT * 3];
 
        //Считываем пиксели
    glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, output);
 
    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;
    unsigned char tempColors = 0;
    int colorMode = 0;
 
    sFile = fopen("Screen.tga", "w"); //Создаем файл для записи результата с режимом "w". 
 
    if (!sFile) 
        return false;
 
    colorMode = 3;
    bits = 24;
 
        //Тут темный лес для меня
    header[0] = WIDTH % 256;
    header[1] = WIDTH / 256;
    header[2] = HEIGHT % 256;
    header[3] = HEIGHT / 256;
    header[4] = bits;
    header[5] = 0;
 
        //Записываем какие-то "заголовки", но что за "заголовки"... 
    fwrite(tgaHeader, sizeof(tgaHeader), 1, sFile);
    fwrite(header, sizeof(header), 1, sFile);
 
        //Из википедии понял что в tga цвета BRG, по этому автор меняет местами, вроде как
    for (int i = 0; i < WIDTH * HEIGHT * colorMode; i += colorMode)
    {
        tempColors = output[i];
        output[i] = output[i + 2];
        output[i + 2] = tempColors;
    }
 
        //Записываем в файл результат. Но для чего умножать "WIDTH *  HEIGHT * colorMode"
    fwrite(output, WIDTH *  HEIGHT * colorMode, 1, sFile);
 
    fclose(sFile);
 
    delete[] output;
    
    return true;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.07.2015, 14:44
Ответы с готовыми решениями:

Механизм создания и сохранения теста
Привет гуру. Нужен совет/помощь в механизмах создания и проведения теста (как в проге MyTestX) и его сохранения. Для проведения теста у...

Диалоговые окна для создания,сохранения
Здравствуйте. У меня такая проблема. Есть кнопка. При нажатии на неё, нужно, чтобы появилось диалоговое окно для выбора файла .txt ,чтобы...

Почему зацикливается функция создания/сохранения моделей?
Задача в следующем: есть 3 модели - CurrencyAccount, AccountTransaction, Emission. Нужно, чтобы при создании модели CurrencyAccount...

7
 Аватар для dvano
136 / 67 / 27
Регистрация: 18.06.2014
Сообщений: 216
05.07.2015, 17:28
C++
1
output = new unsigned char[WIDTH * HEIGHT * 3];
Цифра 3 нужна для того, чтобы уместить три компоненты RGB.
Про формат TGA
C++
1
fwrite(output, WIDTH *  HEIGHT * colorMode, 1, sFile);
colorMode = 3.
0
 Аватар для uLong
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
05.07.2015, 17:33  [ТС]
Цитата Сообщение от dvano Посмотреть сообщение
C++
1
output = new unsigned char[WIDTH * HEIGHT * 3];
Цифра 3 нужна для того, чтобы уместить три компоненты RGB.
Про формат TGA
C++
1
fwrite(output, WIDTH *  HEIGHT * colorMode, 1, sFile);
colorMode = 3.
Думаете Википедия, это то, что я не смотрел? Там достаточно много информации. Но новичку трудно понять Все.. Тут нужно более подробнее.. К тому же я не увидел очень нужное мне подробное описание алгоритма.
0
 Аватар для dvano
136 / 67 / 27
Регистрация: 18.06.2014
Сообщений: 216
05.07.2015, 18:07
Что же здесь непонятного? В Wiki есть абсолютно все ответы на все ваши вопросы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
unsigned char tgaHeader[12] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 };// устанавливает тип изображения TrueColor
    unsigned char header[6]; // Описание карты цветов
    unsigned char bits = 0; // Размер элемента карты цветов
 
// ...
 
    header[0] = WIDTH % 256;
    header[1] = WIDTH / 256;
    header[2] = HEIGHT % 256;
    header[3] = HEIGHT / 256;
    header[4] = bits;
    header[5] = 0;
Это часть подробно описывается в Wiki под пунктом "Заголовок файла".
0
 Аватар для uLong
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
05.07.2015, 18:55  [ТС]
Все же прошу подробнее описать алгоритм, а не дать ссылку на Википедию, которую я уже видел... Пожалуйста, кто нибудь
0
1974 / 830 / 115
Регистрация: 01.10.2012
Сообщений: 5,016
Записей в блоге: 2
06.07.2015, 11:20
Цитата Сообщение от uLong Посмотреть сообщение
Для чего header, что за colorMode, bits, tgaHeader. Желательно как можно подробнее, пожалуйста, очень нужно. В качестве дополнения подойдут также всевозможные статьи по конвертации изображений, записи в изображение TGA и т.д.
Разборки с форматом файла - пустая трата времени, для этого есть готовые библиотеки на любой вкус. Напр CxImage (если надо попроще)
0
 Аватар для uLong
0 / 0 / 1
Регистрация: 18.04.2015
Сообщений: 138
06.07.2015, 18:24  [ТС]
Но все же я хочу это знать. Распишите, если не сложно, или туториал какой по этому формату дайте... ну или по JPG, PNG.

Добавлено через 16 минут
Цитата Сообщение от Igor3D Посмотреть сообщение
Разборки с форматом файла - пустая трата времени, для этого есть готовые библиотеки на любой вкус. Напр CxImage (если надо попроще)
Ладно, если уж на то пошло.. Подскажите самую распространенную библиотеку для работы с изображениями (перевод с одного формата в другой и перевод массива пикселей в изображение).
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
07.07.2015, 18:49
Райт, Липчак - OpenGL Суперкнига + диск Был вроде пример работы с картинкой даже по битам.. может поможет =).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.07.2015, 18:49
Помогаю со студенческими работами здесь

Создания однонаправленного списка и сохранения в типизированный файл.
Доброе время суток. Прошу помощь в решении задачи. Я совсем запутался с однонаправленным списком. И вторая проблема состоит в том что не...

Диалог создания/выбора текстового файла для сохранения
Java 8, NetBeans Необходимо сделать диалог сохранения в текстовый файл. Это делает обычный jFileChooser? Требуется не диалог...

Консольный текстовый редактор с возможностью создания и сохранения файлов
Люди помогите пожалуйста у меня завтра зачет по программированию на си шарп. Дали задание: &quot;Создать Консольный текстовый редактор с...

Объясните как подключить opengl к C#
Пожалуйста только без ссылок на сайты я их уже кучу излазил.

Объясните как подключить opengl к C#
Пробывал подключать эту библиотеку, но компилятор ругается и выдаёт кучу ошибок.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru