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组合使用。