我在从iOS上的OpenGL获取图像时遇到了一个奇怪的问题。我用Apple的GLPaint示例代码创建了一个允许用户注释图像的视图。随后将生成的绘画视图作为用户输入表单的一部分添加到各种UITableViewCell中。完成表单后,用户的注释将被捕获到具有以下采样代码的UIImage(在我的PaintingView中)。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;
}
在我的应用程序中,用户可以在两个表单之间切换,这两个表单都包含一个用于注释的PaintingView。如果用户提交初始表单或切换到辅助表单,则图像捕获工作得很好。如果用户提交初始表单然后切换到次要表单,但是来自原始注释的工件出现在第二个表单上。
这里,用户注释并提交初始表单。
这里,只要用户开始注释辅助表单,就会出现初始表单中的工件。
这个问题似乎与采样代码有关,因为它只在采样后出现(我可以在表单之间切换并且每个都没有问题进行注释,只要我没有先采样)。任何想法发生了什么?