5

OpenGL 要素と UIKit 要素を組み合わせたスクリーンショットを撮る方法の例を誰かが提供できるかどうか疑問に思っていました。Apple が非公開にして以来、Apple がUIGetScreenImage()それを置き換えるために使用した 2 つの一般的な方法は、UIKit または OpenGL のみをキャプチャするため、これはかなり困難な作業になりました。

この同様の質問はApple の Technical Q&A QA1714を参照していますが、QA はカメラと UIKit の要素を処理する方法のみを説明しています。同様の質問への回答が示唆するように、UIKit ビュー階層をイメージ コンテキストにレンダリングし、その上に OpenGL ES ビューのイメージを描画するにはどうすればよいですか?

4

1 に答える 1

4

これでうまくいくはずです。基本的にすべてをCGにレンダリングし、何でもできる画像を作成します。

// In Your UI View Controller

- (UIImage *)createSavableImage:(UIImage *)plainGLImage
{    
    UIImageView *glImage = [[UIImageView alloc] initWithImage:[myGlView drawGlToImage]];
    glImage.transform = CGAffineTransformMakeScale(1, -1);

    UIGraphicsBeginImageContext(self.view.bounds.size);

    //order of getting the context depends on what should be rendered first.
    // this draws the UIKit on top of the gl image
    [glImage.layer renderInContext:UIGraphicsGetCurrentContext()];
    [someUIView.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Do something with resulting image 
    return finalImage;
}

// In Your GL View

- (UIImage *)drawGlToImage
{
    // Draw OpenGL data to an image context 

    UIGraphicsBeginImageContext(self.frame.size);

    unsigned char buffer[320 * 480 * 4];

    CGContextRef aContext = UIGraphicsGetCurrentContext();

    glReadPixels(0, 0, 320, 480, GL_RGBA, GL_UNSIGNED_BYTE, &buffer);

    CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, &buffer, 320 * 480 * 4, NULL);

    CGImageRef iref = CGImageCreate(320,480,8,32,320*4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaLast, ref, NULL, true, kCGRenderingIntentDefault);

    CGContextScaleCTM(aContext, 1.0, -1.0);
    CGContextTranslateCTM(aContext, 0, -self.frame.size.height);

    UIImage *im = [[UIImage alloc] initWithCGImage:iref];

    UIGraphicsEndImageContext();

    return im;
}

次に、スクリーンショットを作成します

UIImage *glImage = [self drawGlToImage];
UIImage *screenshot = [self createSavableImage:glImage];
于 2012-07-02T19:43:52.243 に答える