for oldFileName in *.tga; do
[ -f "$oldFileName" ] || break # Break out if no .tga files found.
newFileName=${oldFileName//.tga/.png}
convert $oldFileName $newFileName
rm $oldFileName
echo "Converted $oldFileName to $newFileName"
done
将这些数据保存到文件中是你必须自己做的事情,或者使用第三方库- OpenGL没有这样的功能。 如果你想自己做的话,Windows.bmp可能是最简单的-维基百科有一个pretty good explanation of the file format。否则你可以使用图像保存/加载库:libpng,libjpeg等用于低级控制,或者devIL(还有其他库,但这是我最喜欢的,它是一个非常通用的库,与GL很好地配合)用于高级“Just do it”图像i/o。
pngwriter PNG(width, height, 1.0, fileName); // "1.0" stand for the white background
PNG.plot(x, y, R, G, B);
PNG.close();
字符串 请注意,由于PNGwriter从图像的左上角开始保存每个像素,而数组get from glReadPixels()从窗口的左下角开始,因此保存整个图像的代码可能如下所示:
GLfloat* pixels = new GLfloat[nPixels];
glReadPixels(0.0, 0.0, width, height,GL_RGB, GL_FLOAT, pixels);
pngwriter PNG(width, height, 1.0, fileName);
size_t x = 1;
size_t y = 1;
double R, G, B;
for(size_t i=0; i<npixels; i++) // "i" is the index for array "pixels"
{
switch(i%3)
{
case 2:
B = static_cast<double>(pixels[i]); break;
case 1:
G = static_cast<double>(pixels[i]); break;
case 0:
R = static_cast<double>(pixels[i]);
PNG.plot(x, y, R, G, B); // set pixel to position (x, y)
if( x == width ) // Move to the next row of image
{
x=1;
y++;
}
else // To the next pixel
{ x++; }
break;
}
}
PNG.close();
8条答案
按热度按时间eh57zj3b1#
这段代码捕获OpenGL窗口并导出为BMP文件。您必须有FreeImage库才能运行它。
字符串
mu0hgdu02#
inb24sb23#
可运行示例
的数据
每次您在窗口上单击鼠标时,将使用当前屏幕截图创建一个
tmpX.ppm
文件。例如,您可以在Linux上使用
eog
查看此文件,并使用文本编辑器检查它。要在不显示窗口的情况下进行渲染,请参见:How to use GLUT/OpenGL to render to a file?
字符串
编译工具:
型
在Ubuntu 15.10,OpenGL 4.5.0 NVIDIA 352.63上测试。
瓦肯
这个例子刚刚工作:https://github.com/SaschaWillems/Vulkan/blob/b9f0ac91d2adccc3055a904d3a8f6553b10ff6cd/examples/screenshot/screenshot.cpp如何运行它:在Vulkan中没有Surface可以进行屏幕外渲染吗?
的
sy5wg1nm4#
简单而快速的解决方案。
***注意:**输出文件扩展名为
tga
。代码如下:
字符串
调用函数:
型
将TARGA文件转换为PNG的bash脚本:
型
h5qlskok5#
将这些数据保存到文件中是你必须自己做的事情,或者使用第三方库- OpenGL没有这样的功能。
如果你想自己做的话,Windows.bmp可能是最简单的-维基百科有一个pretty good explanation of the file format。否则你可以使用图像保存/加载库:libpng,libjpeg等用于低级控制,或者devIL(还有其他库,但这是我最喜欢的,它是一个非常通用的库,与GL很好地配合)用于高级“Just do it”图像i/o。
gywdnpxw6#
你可以用@Rafael的答案和OpenCV保存截图:
字符串
感谢OpenCV:https://stackoverflow.com/a/9098883/10152334
whlutmcx7#
一般来说,OpenGL不提供保存图像的功能。我认为最快和最简单的方法是保存到. PPM。然而,这种格式是未压缩的,这意味着它的文件大小会非常大。现在只有相当多的程序才能支持它。
我更喜欢将图像保存为.png文件,它是压缩的,但也提供无损图像,并受到许多浏览器的支持。要将OpenGL保存为.png格式,我首先推荐PNGwriter。它非常简单易用。例如,要保存图像的像素,颜色为(R,G,B),位置为(x,y),您的代码将是(请参阅PNGwriter网站中的“快速入门”):
字符串
请注意,由于PNGwriter从图像的左上角开始保存每个像素,而数组get from glReadPixels()从窗口的左下角开始,因此保存整个图像的代码可能如下所示:
型
gijlo24d8#
我已经修改了Ciro Bullli OurBigBook.com的答案,以包括线程和更好的性能。
字符串