2011-07-14 9 views
3

に取り組んでいます... は/ iphone上で正常に動作していますipadシミュレータとiphoneデバイスではなく、iPad上でのみ。 スクリーンショットコード、私はこの奇妙な問題を抱えていますiphone

間違っていただきましたすべてのアイデアを iphoneデバイスは、iOSのバージョン3.1.1を持っているとiPadは、iOS 4.2である...

- (UIImage *)screenshotImage { 
CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
int backingWidth = screenBounds.size.width; 
int backingHeight =screenBounds.size.height; 
NSInteger myDataLength = backingWidth * backingHeight * 4; 
GLuint *buffer = (GLuint *) malloc(myDataLength); 
glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA4, GL_UNSIGNED_BYTE, buffer); 
for(int y = 0; y < backingHeight/2; y++) { 
    for(int xt = 0; xt < backingWidth; xt++) { 
     GLuint top = buffer[y * backingWidth + xt]; 
     GLuint bottom = buffer[(backingHeight - 1 - y) * backingWidth + xt]; 
     buffer[(backingHeight - 1 - y) * backingWidth + xt] = top; 
     buffer[y * backingWidth + xt] = bottom; 
    } 
} 
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, myDataLength, releaseScreenshotData); 
const int bitsPerComponent = 8; 
const int bitsPerPixel = 4 * bitsPerComponent; 
const int bytesPerRow = 4 * backingWidth; 

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; 
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 
CGImageRef imageRef = CGImageCreate(backingWidth,backingHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent); 
CGColorSpaceRelease(colorSpaceRef); 
CGDataProviderRelease(provider); 

UIImage *myImage = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 

// myImage = [self addIconToImage:myImage]; 
return myImage;}  
.. ??

答えて

2

これらの2行は

NSInteger myDataLength = backingWidth * backingHeight * 4; 

glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA4, GL_UNSIGNED_BYTE, buffer); 

GL_RGB4と一致していませんが、しかし、あなたは、チャンネルあたり8ビットに割り当てている、チャンネルあたり4ビットを意味します。適切なトークンはGL_RGB8です。 iPhoneのGL_RGB4はサポートされていない可能性があり、GL_RGBAにフォールバックする可能性があります。また

あなたは正しいバッファから読んでいることを確認してください(フロント対は、任意の(誤って)バインドFBOs対左)。バッファスワップを行う前に、バックバッファから読み込むことをお勧めします。

+0

k個のおかげで...今私はGL_RGBAにGL_RGB4を変更していました。問題....私はGL_RGBA8に変更し – Tornado

+0

両方のデバイスに同じコードを使用して、mをいただきましたコードは、ちょうどGL_RGBAは(注意「8」)ではない、任意のアイデアiphoneデバイス上で良いではなく、iPadのデバイス上で実行されています。 – datenwolf

+0

ちょっと私のxcodeは、GL_RGBA8_OESをオプションとして与える代わりに、GL_RGBA8のオプションを与えません。このGL_RGBA8_OESを使用すると、コンパイル時エラーが発生します。 "GL_RGBA8_OESはこのスコープで定義されていません" " – Tornado

0

アンチエイリアスのためにマルチサンプリングテクニックを使用しています... glReadpixels()はマルチサンプルFBOから直接読み取ることができません。それをシングルサンプルバッファに解決してから読んでください...以下の記事を参照してください -

Reading data using glReadPixel() with multisampling

0

スクリーンショットをOpenGL ESのアップルのドキュメントからの迅速な応答を

- (UIImage*)snapshot:(UIView*)eaglview 
{ 
    GLint backingWidth, backingHeight; 

    // Bind the color renderbuffer used to render the OpenGL ES view 
    // If your application only creates a single color renderbuffer which is already bound at this point, 
    // this call is redundant, but it is needed if you're dealing with multiple renderbuffers. 
    // Note, replace "_colorRenderbuffer" with the actual name of the renderbuffer object defined in your class. 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, _colorRenderbuffer); 

    // Get the size of the backing CAEAGLLayer 
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 

    NSInteger x = 0, y = 0, width = backingWidth, height = backingHeight; 
    NSInteger dataLength = width * height * 4; 
    GLubyte *data = (GLubyte*)malloc(dataLength * sizeof(GLubyte)); 

    // Read pixel data from the framebuffer 
    glPixelStorei(GL_PACK_ALIGNMENT, 4); 
    glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); 

    // Create a CGImage with the pixel data 
    // If your OpenGL ES content is opaque, use kCGImageAlphaNoneSkipLast to ignore the alpha channel 
    // otherwise, use kCGImageAlphaPremultipliedLast 
    CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, data, dataLength, NULL); 
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 
    CGImageRef iref = CGImageCreate(width, height, 8, 32, width * 4, colorspace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast, 
            ref, NULL, true, kCGRenderingIntentDefault); 

    // OpenGL ES measures data in PIXELS 
    // Create a graphics context with the target size measured in POINTS 
    NSInteger widthInPoints, heightInPoints; 
    if (NULL != UIGraphicsBeginImageContextWithOptions) { 
     // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration 
     // Set the scale parameter to your OpenGL ES view's contentScaleFactor 
     // so that you get a high-resolution snapshot when its value is greater than 1.0 
     CGFloat scale = eaglview.contentScaleFactor; 
     widthInPoints = width/scale; 
     heightInPoints = height/scale; 
     UIGraphicsBeginImageContextWithOptions(CGSizeMake(widthInPoints, heightInPoints), NO, scale); 
    } 
    else { 
     // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext 
     widthInPoints = width; 
     heightInPoints = height; 
     UIGraphicsBeginImageContext(CGSizeMake(widthInPoints, heightInPoints)); 
    } 

    CGContextRef cgcontext = UIGraphicsGetCurrentContext(); 

    // UIKit coordinate system is upside down to GL/Quartz coordinate system 
    // Flip the CGImage by rendering it to the flipped bitmap context 
    // The size of the destination area is measured in POINTS 
    CGContextSetBlendMode(cgcontext, kCGBlendModeCopy); 
    CGContextDrawImage(cgcontext, CGRectMake(0.0, 0.0, widthInPoints, heightInPoints), iref); 

    // Retrieve the UIImage from the current context 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    // Clean up 
    free(data); 
    CFRelease(ref); 
    CFRelease(colorspace); 
    CGImageRelease(iref); 

    return image; 
} 
関連する問題