在iPhone上使用Alpha通道捕获EAGLview内容

时间:2009-06-07 17:44:41

标签: iphone opengl screenshot alpha eaglview

一直在努力解决这个问题很长一段时间,到目前为止找不到答案。基本上,我想要做的是捕获我的EAGLview的内容,然后使用它将其与其他图像合并。无论如何,主要的问题是,当我将EAGLview中的所有内容保存到photoalbum或将其放入UIImageView时,它会变得不透明。让我与你分享一些代码,我在其他地方找到了:

- (CGImageRef) glToUIImage {
unsigned char buffer[320*480*4];
glReadPixels(0,0,320,480,GL_RGBA,GL_UNSIGNED_BYTE,&buffer);
CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, &buffer, 320*480*4, NULL);
CGImageRef iref = CGImageCreate(320,480,8,32,320*4,CGColorSpaceCreateDeviceRGB(),kCGBitmapByteOrderDefault,ref,NULL,true,kCGRenderingIntentDefault);

size_t width         = CGImageGetWidth(iref);
size_t height        = CGImageGetHeight(iref);
size_t length        = width*height*4;
uint32_t *pixels     = (uint32_t *)malloc(length);
CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width*4, CGImageGetColorSpace(iref), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextTranslateCTM(context, 0.0, height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGRectMake(0.0, 0.0, width, height), iref);
CGImageRef outputRef = CGBitmapContextCreateImage(context);
UIImage *outputImage = [UIImage imageWithCGImage:outputRef];

UIImageWriteToSavedPhotosAlbum(outputImage, nil, nil, nil);
return outputRef;

}

正如我已经提到的,这完全抓住了我的EAGLview的内容,但我无法获得具有alpha值的图像。

任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:2)

我可以看到两个地方你可能会失去透明度:

  1. 当您绘制场景时:您的场景是否具有透明背景?确保你正在做一个类似(0,0,0,0)而不是(0,0,0,1)的glClear。
  2. 当你正在绘制图像进行翻转时:这里的默认背景颜色是什么?看起来很可能是一个不透明的黑色,你最终会得到你场景的透明部分。
  3. 您可以通过在翻转之前保存图像来检查#2是否是您的问题,如果是,您可以通过直接翻转像素缓冲区中的内存而不是使用Core Graphics调用来避免翻转过程。