对于IOS,如何使用vImage将ARGB图像转换为灰度图像
Posted
技术标签:
【中文标题】对于IOS,如何使用vImage将ARGB图像转换为灰度图像【英文标题】:For IOS, how to use vImage to convert an ARGB image to Gray image 【发布时间】:2015-07-06 08:49:05 【问题描述】:我是ios APP开发的大一,遇到一个问题:“如何使用vImage将ARGB图像转换为灰度图像”。实际上,我已经通过其他方法实现了这种转换处理。但是,我发现“vImage”可以通过“加速框架参考”完成这项工作。 我试过这种方法,但没有任何转换结果。在这里,我附上代码,你能帮帮我吗?
-(UIImage *)rgbTograyByvImage
const size_t width = self.size.width * self.scale;
const size_t height = self.size.height * self.scale;
const size_t bytesPerRow = width * 4;
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGContextRef bmContext= CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, space, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(space);
if (!bmContext)
return nil;
CGContextDrawImage(bmContext, (CGRect).origin.x = 0.0f, .origin.y = 0.0f, .size.width = width, .size.height = height, self.CGImage);
UInt32 *data = (UInt32 *)CGBitmapContextGetData(bmContext);
if (!data)
CGContextRelease(bmContext);
return nil;
int Aphal = 0;
int Red = 1;
int Green = 2;
int Blue = 3;
UInt8 *aphalSpace = malloc(sizeof(UInt8) * width * height);
UInt8 *redSpace = malloc(sizeof(UInt8) * width * height);
UInt8 *greenSpace = malloc(sizeof(UInt8) * width * height);
UInt8 *blueSpace = malloc(sizeof(UInt8) * width * height);
for (int y=0; y<height; y++)
for (int x=0; x<width; x++)
UInt8 *argbPixel = (UInt8 *) (&data[y*width+x]);
aphalSpace[y*width+x] = argbPixel[Aphal];
redSpace[y*width+x] = argbPixel[Red];
greenSpace[y*width+x] = argbPixel[Green];
blueSpace[y*width+x] = argbPixel[Blue];
vImage_Buffer argbImageBuffer = (UInt8*)data, height, width, bytesPerRow;
vImage_Buffer aImageBuffer = aphalSpace, height, width, width;
vImage_Buffer rImageBuffer = redSpace, height, width, width;
vImage_Buffer gImageBuffer = greenSpace, height, width, width;
vImage_Buffer bImageBuffer = blueSpace, height, width, width;
vImage_Error error;
error = vImageConvert_ARGB8888toPlanar8(&argbImageBuffer, &aImageBuffer, &rImageBuffer, &gImageBuffer, &bImageBuffer, kvImageNoFlags);
if (error != kvImageNoError)
NSLog(@"%s, vImage error %zd", __PRETTY_FUNCTION__, error);
CGImageRef grayImage = CGBitmapContextCreateImage(bmContext);
UIImage *gray = [UIImage imageWithCGImage:grayImage];
CGContextRelease(bmContext);
CGImageRelease(grayImage);
free(aphalSpace);
free(redSpace);
free(greenSpace);
free(blueSpace);
return gray;
【问题讨论】:
我认为您的意思不是 kCGImageAlphaPremultipliedFirst,灰度图像不需要 Alpha 通道。我想你想用 (kCGBitmapByteOrder32Host | kCGImageAlphaNoneSkipFirst) 【参考方案1】:您需要 vImageMatrixMultiply_ARGB8888ToPlanar8,iOS 9 的新功能。
【讨论】:
以上是关于对于IOS,如何使用vImage将ARGB图像转换为灰度图像的主要内容,如果未能解决你的问题,请参考以下文章
使用 vImageScale_ARGB8888 缩放图像时图像质量受到影响 - Cocoa Objective C
c_cpp Objective-C类将十六进制字符串转换为UIColor。支持#RGB#ARGB #RRGGBB #AARRGGBBUsage:[UIColor colorWithHexString: