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番目のフォームに表示されます。
ここでは、ユーザーが最初のフォームに注釈を付けて送信します。
ここで、ユーザーがセカンダリフォームに注釈を付けるとすぐに、最初のフォームのアーティファクトが表示されます。
サンプリングの後にしか表示されないので、問題はサンプルコードに関連しているようです(最初にサンプリングしない限り、フォームを切り替えたり、問題なくそれぞれ注釈を付けることができます)。ここで起こっていることは何ですか?