2015-10-04 64 views
3

我用下面的方法导出我的OpenGL绘图到一个UIImage:创建从PNG的OpenGL绘图的UIImage

-(UIImage*)saveOpenGLDrawnToUIImage:(NSInteger)aWidth height:(NSInteger)aHeight { 
    NSInteger myDataLength = aWidth * aHeight * 4; 

    GLubyte *buffer = (GLubyte *) malloc(myDataLength); 
    glReadPixels(0, 0, aWidth, aHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 

    GLubyte *buffer2 = (GLubyte *) malloc(myDataLength); 
    for(int y = 0; y < aHeight; y++) 
    { 
     for(int x = 0; x < aWidth * 4; x++) 
     { 
      buffer2[(aHeight-1 - y) * aWidth * 4 + x] = buffer[y * 4 * aWidth + x]; 
     } 
    } 

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, NULL); 

    int bitsPerComponent = 8; 
    int bitsPerPixel = 32; 
    int bytesPerRow = 4 * aWidth; 
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; 
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 

    CGImageRef imageRef = CGImageCreate(aWidth, aHeight, bitsPerComponent, bitsPerPixel, bytesPerRow,  colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent); 

    UIImage *myImage = [UIImage imageWithCGImage:imageRef]; 
    return myImage; 
} 

但背景永远是黑色的,而不是透明的。

我试过使用CGImageRef imageRef = CGImageCreateWithPNGDataProvider(provider, NULL, NO, kCGRenderingIntentDefault);,但它总是生成零。

我怎样才能得到这个处理透明背景?

回答

2

这是一个关于如何从原始RGBA数据创建图像的问题。我认为你缺少的位图信息的描述符,告诉你想要的alpha通道...

尝试Creating UIImage from raw RGBA data

第一个注释说明,你应该使用kCGBitmapByteOrder32Big|kCGImageAlphaLast

+1

非常感谢您! 'CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Big | kCGImageAlphaLast;'运作良好。 – Allen