5

フルスクリーンのスクリーンショットを撮り、pngとして保存しようとしています。ここでコードを見つけて、少し修正しました。スクリーンショットにはopenGLとGlutを使用し、pngで保存するにはcのgdライブラリを使用します。私が得ているのは黒いpngだけで、その理由がわかりません。stackoverflow で検索したところ、いくつかの投稿が見つかりましたが、残念ながら役に立ちませんでした。それらの 1 つは glReadBuffer( GL_FRONT); を使用することでした。glReadBuffer(GL_BACK) の代わりに; 私はそれらの両方を試してみましたが、成功しませんでした。これが私のコードです:

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);
}

私が見逃しているのは何ですか?

4

2 に答える 2

2

悪魔の画像ライブラリを使用して、次のようにスクリーンショットを撮ることができます。

void takeScreenshot(const char* screenshotFile)
{
    ILuint imageID = ilGenImage();
    ilBindImage(imageID);
    ilutGLScreen();
    ilEnable(IL_FILE_OVERWRITE);
    ilSaveImage(screenshotFile);
    ilDeleteImage(imageID);
    printf("Screenshot saved to: %s\n", screenshotFile);
}

takeScreenshot("screenshot.png");
于 2012-11-22T16:57:03.957 に答える
1

C++ ライブラリの使用を拒否しない場合は、PNGwriterを試す必要があります。ピクセルごとに画像とその RGB 値を書き込みます。glReadPixels() が左下から開始する間、PNGwriter は左上隅から開始するため、コードは次のようになります。

GLfloat* OpenGLimage = new GLfloat[nPixels];
glReadPixels(0.0, 0.0, width, height,GL_RGB, GL_FLOAT, OpenGLimage);
pngwriter PNG(width, height, 1.0, fileName);
size_t x = 1;   // start the top and leftmost point of the window
size_t y = 1;
double R, G, B;
for(size_t i=0; i<npixels; i++)
{
      switch(i%3) //the OpenGLimage array look like [R1, G1, B1, R2, G2, B2,...]
     {
           case 2:
                 B = (double) pixels[i]; break;
           case 1:
                 G = (double) pixels[i]; break;
           case 0:
                 R = (double) pixels[i];
                 PNG.plot(x, y, R, G, B);
                 if( x == width )
                 {
                       x=1;
                       y++;
                  }
                  else
                  { x++; }
                  break;
     }
}
PNG.close();

PS。libgd も試してみましたが、1 つのイメージ ファイル (ハードディスクまたはメモリ内) を別の形式のイメージに変換するだけのようです。しかし、多くのPNGファイルをGIF形式に変換してGIFアニメーションを作成したい場合には、それでも便利だと思います.

于 2014-07-23T09:22:42.227 に答える