2011-11-29 134 views
0

我在从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。如果用户提交初始表单或切换到辅助表单,则图像捕获工作得很好。如果用户提交初始表单然后切换到次要表单,但是来自原始注释的工件出现在第二个表单上。

这里,用户注释并提交初始表单。 Initial Form Submission

这里,只要用户开始注释辅助表单,就会出现初始表单中的工件。 Secondary Form After Editing

这个问题似乎与采样代码有关,因为它只在采样后出现(我可以在表单之间切换并且每个都没有问题进行注释,只要我没有先采样)。任何想法发生了什么?

回答

0

我不确定问题到底是什么(看起来缓冲区内存已损坏,但我找不到地址空间可能重叠的位置)。

最初的Apple代码使用layoutSubviews动态调整绘制表面的大小,如果布局更改 - 并且在每次调用时删除并重新创建帧缓冲区。因为我将绘画视图放置在表视图单元格中,因此在滚动期间多次调用了layoutSubviews,导致无用地创建和删除多次缓冲区。看来,通过这些多次调用的某个地方,缓冲区地址空间开始损坏。

将缓冲区分配移动到我的初始化例程后,以便它只执行一次,一切工作正常。