0

我有一些运行良好的代码用于读取屏幕或屏幕外缓冲区并将结果作为具有透明度的 PNG 保存到 iPad 相册。在 ipad 照片查看器或任何其他图像查看器中查看时,图像会完美显示。然而,在 ipad 的原生照片查看应用程序中,缩略图的透明部分显示了相册中其他图像的一部分。

有没有其他人遇到过这个问题,如果有的话,找到解决办法了吗?这是我用于生成图像的屏幕外(部分)代码:

EAGLContext *myContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
[EAGLContext setCurrentContext:myContext];

[... set up render buffer code removed for display ...]

[EAGLContext setCurrentContext:myContext];

ImageTextureManager *imageManager = [[ImageTextureManager alloc] init];
[imageManager loadImageTexture:gAppModel.currentImageRef];
[imageManager release];

glBindRenderbufferOES(GL_RENDERBUFFER_OES, offscreenColorRenderbuffer);

[self renderTransformedImage]; // render the image to the buffer

[myContext presentRenderbuffer:GL_RENDERBUFFER_OES];

// grab image from frameBuffer and return it as UIImage
NSInteger x = 0, y = 0;
NSInteger dataLength = width * height * 4;
GLubyte *data = (GLubyte*)malloc(dataLength * sizeof(GLubyte));

glPixelStorei(GL_PACK_ALIGNMENT, 4);
glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);

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);


UIGraphicsBeginImageContext(CGSizeMake(width, height));
CGContextRef cgcontext = UIGraphicsGetCurrentContext();
CGContextSetBlendMode(cgcontext, kCGBlendModeCopy);
CGContextDrawImage(cgcontext, CGRectMake(0.0, 0.0, width, height), iref);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();  // this call creates an AutoRelease UIImage
NSData* imdata = UIImagePNGRepresentation(image); // get PNG representation
UIImage* myImagePNG = [UIImage imageWithData:imdata]; // wrap UIImage around PNG representation
UIImageWriteToSavedPhotosAlbum(myImagePNG, nil, nil, nil);
UIGraphicsEndImageContext();

感谢 medvedNick 提供的离屏渲染代码:Drawing into OpenGL ES framebuffer and getting UIImage from it on iPhone

4

0 回答 0