通过亮度擦除UIImage?

时间:2015-08-13 17:29:38

标签: ios objective-c uiimage uigraphicscontext heightmap

我有一张高度图(灰度图像,黑色为最低,白色为最高区域),我试图将高于或低于某个阈值的所有内容隔离。我的目标是能够拍摄任何高度贴图,并返回一个新的UIImage,其中所有低于某个高度(即比给定颜色更暗)的东西都被复制,但上面的任何东西(即更亮)都是透明的。

enter image description here

现在我对此非常陌生,所以如果有更好的方法可以解决这个问题,我很乐意听到它,但我的第一直觉是用同样的方式创建一个新的UIImage框架,然后根据原件中给定区域的亮度绘制它。有点像...

-(UIImage*)mapIsolatedFromThreshold:(CGFloat)threshold showAbove:(BOOL)above;

因此,threshold变量可以是0.70.2或其他任何内容,然后如果你想要更高的一切,你可以将above设置为YES(如果你想让一切都更低(即更暗),那么就比阈值更轻,或NO

问题是,我以前从未进行过图像处理或绘图,所以我不知道如何设置该方法。我有一种模糊的感觉,它会涉及UIGraphicsBeginImageContext等等,但我还没有找到任何基于另一幅图像的亮度使用它的问题或教程。

我如何制作这样的方法?或者是否有一些预先存在的系统用于处理iOS中的高度图,这使得这一切都比我对它的处理容易得多?

1 个答案:

答案 0 :(得分:0)

经过几个小时的狩猎,我能够拼凑出这种方法。如果其他人需要做类似的事情,这里就是。我仍然不能完全理解它正在做什么,一步一步,但最终结果是我想要的。

-(UIImage*)imageWithLumaMaskFromDark:(CGFloat)lumaFloor toLight:(CGFloat)lumaCeil forImage:(UIImage*)image {
    CGImageRef rawImageRef = image.CGImage;

    const CGFloat colorMasking[6] = {lumaFloor, lumaCeil, lumaFloor, lumaCeil, lumaFloor, lumaCeil};

    UIGraphicsBeginImageContext(image.size);
    CGImageRef maskedImageRef = CGImageCreateWithMaskingColors(rawImageRef, colorMasking);
    {
        //if in iphone
        CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height);
        CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0);
    }

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef);
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    CGImageRelease(maskedImageRef);
    UIGraphicsEndImageContext();
    return result;
}

lumaFloorlumaCeil输入的值介于0到255之间,超出该范围的所有内容都变为完全透明。