2014-04-22 23 views
1

我用這讓我的應用程序的視頻如何創建ARGB圖像從RGBA圖片

我目前使用

glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); 

讀取幀緩衝區,然後使用

-(UIImage *) createARGBImageFromRGBAImage: (UIImage*)image 
{ 
    CGSize dimensions = [image size]; 

    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * dimensions.width; 
    NSUInteger bitsPerComponent = 8; 

    unsigned char *rgba = malloc(bytesPerPixel * dimensions.width * dimensions.height); 
    unsigned char *argb = malloc(bytesPerPixel * dimensions.width * dimensions.height); 

    CGColorSpaceRef colorSpace = NULL; 
    CGContextRef context = NULL; 

    colorSpace = CGColorSpaceCreateDeviceRGB(); 
    context = CGBitmapContextCreate(rgba, dimensions.width, dimensions.height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault); // kCGBitmapByteOrder32Big 
    CGContextDrawImage(context, CGRectMake(0, 0, dimensions.width, dimensions.height), [image CGImage]); 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    for (int x = 0; x < dimensions.width; x++) { 
     for (int y = 0; y < dimensions.height; y++) { 
      NSUInteger offset = ((dimensions.width * y) + x) * bytesPerPixel; 
      argb[offset + 0] = rgba[offset + 3]; 
      argb[offset + 1] = rgba[offset + 0]; 
      argb[offset + 2] = rgba[offset + 1]; 
      argb[offset + 3] = rgba[offset + 2]; 
     } 
    } 

    colorSpace = CGColorSpaceCreateDeviceRGB(); 
    context = CGBitmapContextCreate(argb, dimensions.width, dimensions.height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrderDefault); // kCGBitmapByteOrder32Big 
    CGImageRef imageRef = CGBitmapContextCreateImage(context); 
    image = [UIImage imageWithCGImage: imageRef]; 
    CGImageRelease(imageRef); 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    free(rgba); 
    free(argb); 

    return image; 
} 

做轉換,但似乎很慢。

推薦一些更快的方式

+1

看到這個答案http://stackoverflow.com/questions/8771471/converting-rgba-to-argb-glreadpixels-avassetwriter –

+0

我是小白。請提供將圖片渲染爲紋理的示例(使用具有該紋理的FBO作爲顏色附件)。接下來使用混合片段着色器將該紋理渲染到另一個幀緩衝區: – anuj

+0

另一種可能性是使用[Accelerate Framework](https://developer.apple.com/library/ios/documentation/Performance/Reference/vImage_conversion/Reference/ reference.html#// apple_ref/doc/uid/TP40005488) –

回答

1
#import <Accelerate/Accelerate.h> ////import into your class file. 


-(UIImage *) createARGBImageFromRGBAImage: (UIImage*)image 
{ //CGSize size = CGSizeMake(320, 480); 
    CGSize dimensions = CGSizeMake(320, 480); 
    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * dimensions.width; 
    NSUInteger bitsPerComponent = 8; 

    unsigned char *rgba = malloc(bytesPerPixel * dimensions.width * dimensions.height); 
    unsigned char *argb = malloc(bytesPerPixel * dimensions.width * dimensions.height); 

    CGColorSpaceRef colorSpace = NULL; 
    CGContextRef context = NULL; 

    colorSpace = CGColorSpaceCreateDeviceRGB(); 
    context = CGBitmapContextCreate(rgba, dimensions.width, dimensions.height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault); // kCGBitmapByteOrder32Big 
    CGContextDrawImage(context, CGRectMake(0, 0, dimensions.width, dimensions.height), [image CGImage]); 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    const vImage_Buffer src = { rgba, dimensions.height, dimensions.width, bytesPerRow }; 
    const vImage_Buffer dis = { rgba, dimensions.height, dimensions.width, bytesPerRow }; 
    const uint8_t map[4] = {3,0,1,2}; 
    vImagePermuteChannels_ARGB8888(&src, &dis, map, kvImageNoFlags); 


    /*for (int x = 0; x < dimensions.width; x++) { 
     for (int y = 0; y < dimensions.height; y++) { 
      NSUInteger offset = ((dimensions.width * y) + x) * bytesPerPixel; 
      argb[offset + 0] = rgba[offset + 3]; 
      argb[offset + 1] = rgba[offset + 0]; 
      argb[offset + 2] = rgba[offset + 1]; 
      argb[offset + 3] = rgba[offset + 2]; 
     } 
    }*/ 




    colorSpace = CGColorSpaceCreateDeviceRGB(); 
    context = CGBitmapContextCreate(dis.data, dimensions.width, dimensions.height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrderDefault); // kCGBitmapByteOrder32Big 
    CGImageRef imageRef = CGBitmapContextCreateImage(context); 
    image = [UIImage imageWithCGImage: imageRef]; 
    CGImageRelease(imageRef); 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    free(rgba); 
    free(argb); 

    return image; 
}