Захват контента EAGLview С альфа-каналом на iPhone - PullRequest
3 голосов
/ 07 июня 2009

боролись с этой проблемой уже довольно давно и пока не смогли найти ответ. По сути, я хочу захватить содержимое моего EAGLview, а затем использовать его для объединения с другими изображениями. Как бы то ни было, основная проблема заключается в том, что все прозрачное в моем EAGLview становится непрозрачным при сохранении его в фотоальбом или в 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, но я не могу получить изображение с его альфа-значениями.

Любая помощь приветствуется. Спасибо!

1 Ответ

2 голосов
/ 06 июля 2009

В двух местах я вижу, что вы можете потерять прозрачность:

  1. когда вы рисуете свою сцену: у вашей сцены есть прозрачный фон? убедитесь, что вы делаете glClear для чего-то вроде (0,0,0,0), а не (0,0,0,1).
  2. когда вы рисуете изображение, чтобы перевернуть его: какой здесь цвет фона по умолчанию? Вероятно, это непрозрачный черный цвет, и в итоге вы получите то, что раньше было прозрачными частями вашей сцены.

Вы можете проверить, является ли проблема № 2 вашей проблемой, сохранив изображение перед тем, как перевернуть его, и если это так, вы можете избежать процесса переворачивания памяти, переворачивая память в своем пиксельном буфере напрямую, вместо использования вызовов Core Graphics.

...