Я рисую экран с помощью команд OpenGL. И я должен сохранить этот экран в формате .bmp или .png. Но я не могу этого сделать. Я использую glReadpixels, но я не могу продолжать. Как сохранить этот чертеж в C++ с помощью OpenGL?Как сохранить OpenGL-ничью с помощью OpenGL?
ответ
Вот оно! Вы должны включить WinGDI.h
void SaveAsBMP(const char *fileName)
{
FILE *file;
unsigned long imageSize;
GLbyte *data=NULL;
GLint viewPort[4];
GLenum lastBuffer;
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
bmfh.bfType='MB';
bmfh.bfReserved1=0;
bmfh.bfReserved2=0;
bmfh.bfOffBits=54;
glGetIntegerv(GL_VIEWPORT,viewPort);
imageSize=((viewPort[2]+((4-(viewPort[2]%4))%4))*viewPort[3]*3)+2;
bmfh.bfSize=imageSize+sizeof(bmfh)+sizeof(bmih);
data=(GLbyte*)malloc(imageSize);
glPixelStorei(GL_PACK_ALIGNMENT,4);
glPixelStorei(GL_PACK_ROW_LENGTH,0);
glPixelStorei(GL_PACK_SKIP_ROWS,0);
glPixelStorei(GL_PACK_SKIP_PIXELS,0);
glPixelStorei(GL_PACK_SWAP_BYTES,1);
glGetIntegerv(GL_READ_BUFFER,(GLint*)&lastBuffer);
glReadBuffer(GL_FRONT);
glReadPixels(0,0,viewPort[2],viewPort[3],GL_BGR,GL_UNSIGNED_BYTE,data);
data[imageSize-1]=0;
data[imageSize-2]=0;
glReadBuffer(lastBuffer);
file=fopen(fileName,"wb");
bmih.biSize=40;
bmih.biWidth=viewPort[2];
bmih.biHeight=viewPort[3];
bmih.biPlanes=1;
bmih.biBitCount=24;
bmih.biCompression=0;
bmih.biSizeImage=imageSize;
bmih.biXPelsPerMeter=45089;
bmih.biYPelsPerMeter=45089;
bmih.biClrUsed=0;
bmih.biClrImportant=0;
fwrite(&bmfh,sizeof(bmfh),1,file);
fwrite(&bmih,sizeof(bmih),1,file);
fwrite(data,imageSize,1,file);
free(data);
fclose(file);
}
Отредактировано: Это GL_BGR, а не GL_RGB. – chakmeshma
Если вы не чувствуете себя особенно амбициозным (или, возможно, мазохистом), вы, вероятно, захотите использовать библиотеку, такую как DevIL, которая уже поддерживает это. Текущая версия может загружать и/или сохранять в форматах PNG и BMP вместе с несколькими десятками других.
По сравнению с чем-то вроде IJG это ориентировано гораздо больше на работу с OpenGL или DirectX (например, он может загружать файл довольно прямо в текстуру или наоборот).
Я должен использовать библиотеку opengl. Разве это невозможно? –
Вы используете DevIL вместе с OpenGL. Можно читать пиксели назад с помощью glReadPixels, затем поместить заголовок на передний план, вставить прокладку по мере необходимости и сохранить как файл BMP, но OpenGL не предоставляет ничего, чтобы поддерживать его напрямую. –
Как я могу использовать DevIL? u может помочь мне –
Я знаю, что вы просите растровые форматы, но косвенным образом будет первый выход векторной графики через gl2ps (HTTP (который я думаю, что GL будет делать это!): //www.geuz.org/gl2ps/). Примеры использования предоставляются с пакетом и на сайте (http://www.geuz.org/gl2ps/#tth_sEc3).
Затем векторный вывод можно преобразовать в формат по вашему выбору с помощью другого инструмента (Inkscape, Image/GraphicsMagick и т. Д.) Или библиотеки. Дополнительным преимуществом является то, что вы можете конвертировать в растровые изображения любого разрешения в будущем.
Одно нужно быть зафиксирована на уровне:
bmih.biXPelsPerMeter = bmih.biYPelsPerMeter = 0;
В противном случае, некоторые фото редактирования не может открыть правильно.
- 1. Сохранить выход OpenGL с помощью Alpha?
- 2. Сохранить OpenGL нарисованный элемент как изображение
- 3. Как сохранить и загрузить в OpenGL
- 4. Как визуализировать изображение с помощью OpenGL ES?
- 5. Как масштабировать изображение с помощью openGL (JGL)?
- 6. Как изменить перспективу OpenGL с помощью gluLookAt()?
- 7. Как сделать измеритель мощности с помощью opengl?
- 8. Освещение OpenGL с помощью Cg
- 9. Обработка массива с помощью openGL
- 10. Показать изображение с помощью OpenGL?
- 11. Как написать отображение и выбор изображения с помощью opengl?
- 12. Сохранить файл с запросом «Сохранить как ...» с помощью FileResult
- 13. Сохранить с помощью msoFileDialogFilePicker
- 14. Масштабирование и прокрутка с помощью OpenGL ES
- 15. Как сохранить большую текстуру (эффективно) OpenGL ES 2.0 в Android
- 16. Захват экрана с помощью Glut и OpenGL с Python
- 17. Как обрезать/кликать в OpenGL с помощью u_transformation
- 18. Как текстурировать цилиндр в OpenGL, созданный с помощью triangle_strip?
- 19. Сохранить/[Сохранить как] диалоговое окно при загрузке с помощью wordpress
- 20. Java swing Сохранить и сохранить как функции с помощью JFileChooser
- 21. Как объединить SceneKit с существующим OpenGL с помощью SCNRenderer?
- 22. Как создать файлы совместимые с OpenGL ES2 с помощью glLoadGen?
- 23. Сохранить opengl Texture в массив байтов
- 24. Скопировать изображение с помощью openGL-шейдеров
- 25. Создание объектов с помощью Blender vs. OpenGL
- 26. Opengl вращать объект с помощью мыши (C++)
- 27. перетаскивание изображений с помощью OpenGL C++
- 28. Перемещение формы с помощью мыши в Opengl
- 29. Как нарисовать CGPath с OpenGL?
- 30. Изучение OpenGL с помощью мощного математического фонда?
Это не проблема opengl для сохранения файлов. Для этого вам нужна другая библиотека, например libjpeg. –