2012-07-02 7 views
5

Herkesin OpenGL ve UIKit öğelerini karıştıran bir ekran görüntüsünü nasıl alacağına dair bir örnek sunup sunamayacağını merak ediyorum. Apple, UIGetScreenImage()'u özel hale getirdiğinden beri bu oldukça zor bir görev haline geldi çünkü Apple'ın yerini almak için kullandığı iki yaygın yöntem sadece UIKit'i veya sadece OpenGL'yi yakaladı.Program aracılığıyla, OpenGL ve UIKit öğelerini birleştiren bir ekran görüntüsü alın

This benzer soru başvuruları Apple's Technical Q&A QA1714, ancak QA yalnızca kamera ve UIKit öğelerinin nasıl ele alınacağını açıklamaktadır. UIKit görünüm hiyerarşisini bir görüntü içeriğine dönüştürmek ve daha sonra OpenGL ES görünümünüzün görüntüsünü bunun üzerine benzer soruların cevabını vermek gibi nasıl çiziyorsunuz?

+0

oluşturmak için, bu şeylerin hem idare ediyorum UIGetScreenImage için uygun bir alternatiftir var mı? – Austin

cevap

4

Bu hile yapmalıdır. Temel olarak her şeyi CG'ye dönüştürün ve her şeyi yapabileceğiniz bir görüntü yaratın.

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

Ardından alternatif bir ekran görüntüsü

UIImage *glImage = [self drawGlToImage]; 
UIImage *screenshot = [self createSavableImage:glImage]; 
İlgili konular