Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何从RGBA图像创建ARGB图像_Ios_Opengl Es - Fatal编程技术网

Ios 如何从RGBA图像创建ARGB图像

Ios 如何从RGBA图像创建ARGB图像,ios,opengl-es,Ios,Opengl Es,我用它来制作我的应用程序的视频 我目前使用 glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); 要读取帧缓冲区,然后使用 -(UIImage *) createARGBImageFromRGBAImage: (UIImage*)image { CGSize dimensions = [image size]; NSUInteger bytesPerPixel = 4; NSUInteg

我用它来制作我的应用程序的视频

我目前使用

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;
}
-(UIImage*)从rgbaimage:(UIImage*)图像创建argbimage
{
CGSize维度=[图像大小];
NSU整数字节/像素=4;
NSUInteger bytesPerRow=bytesPerPixel*dimensions.width;
NSU整数比特分量=8;
无符号字符*rgba=malloc(字节/像素*dimensions.width*dimensions.height);
无符号字符*argb=malloc(字节/像素*dimensions.width*dimensions.height);
CGCOLORSPACTEREF colorSpace=NULL;
CGContextRef context=NULL;
colorSpace=CGColorSpaceCreateDeviceRGB();
context=CGBitmapContextCreate(rgba,dimensions.width,dimensions.height,bitsPerComponent,bytesPerRow,colorSpace,KCGIMAGEAlphaPremultipledLast | kCGBitmapByteOrderDefault);//kCGBitmapByteOrder32Big
CGContextDrawImage(上下文,CGRectMake(0,0,dimensions.width,dimensions.height),[image CGImage]);
CGContextRelease(上下文);
CGCOLORSPACTERELEASE(色彩空间);
对于(int x=0;x
进行转换,但速度似乎很慢

建议一些更快的方法

#导入////导入到类文件中。
#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;
}
-(UIImage*)从RGBAIMAGE创建ArgBIMAGE:(UIImage*)图像 {//CGSize size=CGSizeMake(320480); CGSize尺寸=CGSizeMake(320480); NSU整数字节/像素=4; NSUInteger bytesPerRow=bytesPerPixel*dimensions.width; NSU整数比特分量=8; 无符号字符*rgba=malloc(字节/像素*dimensions.width*dimensions.height); 无符号字符*argb=malloc(字节/像素*dimensions.width*dimensions.height); CGCOLORSPACTEREF colorSpace=NULL; CGContextRef context=NULL; colorSpace=CGColorSpaceCreateDeviceRGB(); context=CGBitmapContextCreate(rgba,dimensions.width,dimensions.height,bitsPerComponent,bytesPerRow,colorSpace,KCGIMAGEAlphaPremultipledLast | kCGBitmapByteOrderDefault);//kCGBitmapByteOrder32Big CGContextDrawImage(上下文,CGRectMake(0,0,dimensions.width,dimensions.height),[image CGImage]); CGContextRelease(上下文); CGCOLORSPACTERELEASE(色彩空间); const vImage_Buffer src={rgba,dimensions.height,dimensions.width,bytesPerRow}; const vImage_Buffer dis={rgba,dimensions.height,dimensions.width,bytesPerRow}; 常数映射[4]={3,0,1,2}; vImagePermuteChannels_argb888(&src,&dis,map,kvImageNoFlags); /*对于(int x=0;x
看看这个答案,我是诺布。请提供将图片渲染为纹理的示例(使用带有该纹理的FBO作为颜色附件)。下一步,使用旋转片段着色器将该纹理渲染到另一个帧缓冲区:另一种可能是使用“你不能通过设置正确的上下文字节顺序来实现这一点吗?”?另一篇文章:要获得BGRA图像,您可以使用kCGBitmapByteOrder32Little与kCGImageAlphaFirst或KCGimageAlphaPremultipledFirst或kCGImageAlphaNoneSkipFirst组合使用。