我有一张高度图(灰度图像,黑色为最低,白色为最高区域),我试图将高于或低于某个阈值的所有内容隔离。我的目标是能够拍摄任何高度贴图,并返回一个新的UIImage,其中所有低于某个高度(即比给定颜色更暗)的东西都被复制,但上面的任何东西(即更亮)都是透明的。
现在我对此非常陌生,所以如果有更好的方法可以解决这个问题,我很乐意听到它,但我的第一直觉是用同样的方式创建一个新的UIImage框架,然后根据原件中给定区域的亮度绘制它。有点像...
-(UIImage*)mapIsolatedFromThreshold:(CGFloat)threshold showAbove:(BOOL)above;
因此,threshold
变量可以是0.7
或0.2
或其他任何内容,然后如果你想要更高的一切,你可以将above
设置为YES
(如果你想让一切都更低(即更暗),那么就比阈值更轻,或NO
。
问题是,我以前从未进行过图像处理或绘图,所以我不知道如何设置该方法。我有一种模糊的感觉,它会涉及UIGraphicsBeginImageContext
等等,但我还没有找到任何基于另一幅图像的亮度使用它的问题或教程。
我如何制作这样的方法?或者是否有一些预先存在的系统用于处理iOS中的高度图,这使得这一切都比我对它的处理容易得多?
答案 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;
}
lumaFloor
和lumaCeil
输入的值介于0到255之间,超出该范围的所有内容都变为完全透明。