【问题标题】:For IOS, how to use vImage to convert an ARGB image to Gray image对于IOS,如何使用vImage将ARGB图像转换为灰度图像
【发布时间】: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)

标签: ios vimage


【解决方案1】:

您需要 vImageMatrixMultiply_ARGB8888ToPlanar8,iOS 9 的新功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2018-08-15
    • 1970-01-01
    • 2020-04-16
    • 2010-11-20
    相关资源
    最近更新 更多