我試圖截取全屏並將其保存爲PNG。我發現一個代碼here並修改了一下。對於屏幕截圖,我使用openGL和Glut並保存爲p的gd庫。我所得到的只是一個黑色的PNG,我無法弄清楚爲什麼。我在stackoverflow中搜索並找到了一些帖子,但不幸的是他們沒有幫助。其中之一是使用glReadBuffer(GL_FRONT);而不是glReadBuffer(GL_BACK);我嘗試了兩個都沒有成功。這是我的代碼:使用openGL截圖並將其保存爲PNG
int SVimage2file(char *filename){
int width = glutGet(GLUT_SCREEN_WIDTH);
int height = glutGet(GLUT_SCREEN_HEIGHT);
FILE *png;
GLubyte *OpenGLimage, *p;
gdImagePtr image;
unsigned int r, g, b;
int i,j,rgb;
png = fopen(filename, "wb");
if (png == NULL) {
printf("*** warning: unable to write to %s\n",filename);
return 1;
}
OpenGLimage = (GLubyte *) malloc(width * height * sizeof(GLubyte) * 3);
if(OpenGLimage == NULL){
printf("error allocating image:%s\n",filename);
exit(1);
}
printf("Saving to: %s .\n",filename);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadBuffer(GL_FRONT);
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, OpenGLimage);
p = OpenGLimage;
image = gdImageCreateTrueColor(width,height);
for (i = height-1 ; i>=0; i--) {
for(j=0;j<width;j++){
r=*p++; g=*p++; b=*p++;
rgb = (r<<16)|(g<<8)|b;
//printf("the rgb color %d\n", rgb);
gdImageSetPixel(image,j,i,rgb);
}
}
gdImagePng(image,png);
fclose(png);
gdImageDestroy(image);
}
什麼是我失蹤?
你在哪裏以及如何渲染OpenGL framebuffer?該代碼缺失。 – datenwolf
@datenwolf你是什麼意思。我沒有閱讀glReadBuffer(GL_FRONT)圖形卡的幀緩衝區? – user1656466
恩,不,你正在讀的是OpenGL上下文綁定窗口的framebuffer。並且創建一個OpenGL上下文以匹配窗口的可視化。 **您不能使用OpenGL製作任意截圖。** OpenGL幀緩衝區的內容僅在OpenGL上下文綁定的可繪製內部定義,並且僅限於使用OpenGL繪製的圖像。你是否真的試圖在沒有OpenGL上下文或爲它創建的窗口的情況下進行OpenGL調用? – datenwolf