Создание UIImage с попиксельной альфа-версией из буфера GL - PullRequest
2 голосов
/ 29 января 2010

Я пытаюсь взять свой буфер gl и превратить его в UIImage, сохраняя при этом альфа-пиксель в этом буфере gl. Кажется, он не работает, в результате я получаю буфер без альфы. Кто-нибудь может помочь? Я чувствую, что где-то пропущу несколько ключевых шагов. Буду очень рад любому совету на этот счет.

В основном я делаю:

//Read Pixels from OpenGL
glReadPixels(0, 0, miDrawBufferWidth, miDrawBufferHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

//Make data provider with data.
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, len, NULL);

//Configure image
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGImageRef iref = CGImageCreate(miDrawBufferWidth, miDrawBufferHeight, 8, 32, (4 * miDrawBufferWidth), colorSpaceRef, kCGBitmapByteOrderDefault, provider, NULL, NO, kCGRenderingIntentDefault);

// use device's orientation's width/height to determine context dimensions (and consequently resulting image's dimensions)
uint32* pixels = (uint32 *) IQ_NEW(kHeapGfx, "snapshot_pixels") GLubyte[len];

// use kCGImageAlphaLast? :-/
CGContextRef context = CGBitmapContextCreate(pixels, iRotatedWidth, iRotatedHeight, 8, (4 * iRotatedWidth), CGImageGetColorSpace(iref), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);


CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, miDrawBufferWidth, miDrawBufferHeight), iref);
UIImage *outputImage = [[UIImage alloc] initWithCGImage:CGBitmapContextCreateImage(context)];

//cleanup
CGDataProviderRelease(provider);
CGImageRelease(iref);
CGContextRelease(context);

return outputImage;

1 Ответ

1 голос
/ 29 января 2010

Да! К счастью, очевидно, кто-то решил эту проблему именно здесь: http://www.iphonedevsdk.com/forum/iphone-sdk-development/23525-cgimagecreate-alpha.html

Он сводился к дополнительному флагу kCGImageAlphaLast, передаваемому в CGImageCreate для включения альфа (вместе с флагом kCGBitmapByteOrderDefault). :)

...