2015-10-04 77 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