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 に感謝します: iPhone で OpenGL ES フレームバッファに描画し、そこから UIImage を取得する

4

0 に答える 0