2011-11-29 15 views
0

iOSのOpenGLからの画像キャプチャに奇妙な問題があります。私はAppleのGLPaintサンプルコードを使用して、ユーザーがイメージに注釈を付けることができるビューを作成しました。結果として得られるペイントビューは、ユーザ入力フォームの一部として様々なUITableViewCellに追加されます。フォームの完成時に、ユーザーの注釈は、次のサンプリングコード(私のPaintingView内)でUIImageに取り込まれます。iOSのOpenGL ESバッファ?

- (UIImage*)getImage { 

    // calculate buffer size 
    NSInteger dataLength = backingWidth * backingHeight * 4; 
    void *buffer = (GLubyte*)malloc(dataLength); 
    GLubyte *data = (GLubyte*)malloc(dataLength * sizeof(GLubyte)); 

    // transfer image from frame buffer 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glPixelStorei(GL_PACK_ALIGNMENT, 4); 
    glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, data); 

    // capture image 
    CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, data, dataLength, NULL); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGImageRef imageRef = CGImageCreate(backingWidth, backingHeight, 8, 32, backingWidth * 4, colorSpace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast, ref, NULL, true, kCGRenderingIntentDefault); 
    UIImage *image = [UIImage imageWithCGImage:imageRef scale:1.0f orientation:UIImageOrientationDownMirrored]; 

    // clean up 
    CGImageRelease(imageRef); 
    CGColorSpaceRelease(colorSpace); 
    CGDataProviderRelease(ref); 
    free(buffer); 
    free(data); 

    // capture image 
    if(image == nil) 
     NSLog(@"Save EAGLImage failed to bind data to a UIImage"); 

    return image; 
} 

私のアプリケーションでは、ユーザーは注釈に使用される1つのPaintingViewを含む2つのフォームを切り替えることができます。ユーザーが初期フォームを送信するか、セカンダリフォームに切り替えると、イメージキャプチャがうまく動作します。ユーザーが最初のフォームを送信してから2番目のフォームに切り替えると、元の注釈の成果物が2番目のフォームに表示されます。

ここでは、ユーザーが最初のフォームに注釈を付けて送信します。 Initial Form Submission

ここで、ユーザーがセカンダリフォームに注釈を付けるとすぐに、最初のフォームのアーティファクトが表示されます。 Secondary Form After Editing

サンプリングの後にしか表示されないので、問題はサンプルコードに関連しているようです(最初にサンプリングしない限り、フォームを切り替えたり、問題なくそれぞれ注釈を付けることができます)。ここで起こっていることは何ですか?

答えて

0

バッファメモリが破損しているように見えますが、アドレス空間が重複している場所を特定できないようです。

オリジナルのAppleコードは、layoutSubviewsを使用してレイアウトが変更されたときに、ペインティングサーフェスのサイズを動的に変更しました - すべての呼び出しでフレームバッファを削除して再作成していました。ペイントビューをテーブルビューのセルに配置したため、スクロール中にlayoutSubviewsが何度か呼び出され、バッファが不必要に複数回作成され削除されました。これらの複数の呼び出しのどこかで、バッファアドレス空間が破損し始めたようです。

バッファ割り当てを初期化ルーチンに移動した後、一度だけ実行されるようにすると、すべて正常に動作します。

関連する問題