通过亮度擦除 UIImage?
Erase UIImage by lightness?
我有一个高度图(灰度图像,黑色为最低区域,白色为最高区域),我试图隔离高于或低于特定阈值的所有内容。我的目标是能够获取任何高度贴图,并且 return 一个新的 UIImage,其中低于特定高度(即比给定颜色更暗)的所有内容都被复制,但高于(即更亮)的任何内容都是透明的。
现在我对此很陌生,所以如果有更好的方法来解决这个问题,我很想听听,但我的第一直觉是创建一个具有相同框架的新 UIImage,然后绘制根据原件中给定区域的亮度加入其中。像...
-(UIImage*)mapIsolatedFromThreshold:(CGFloat)threshold showAbove:(BOOL)above;
因此,threshold
变量可以是 0.7
或 0.2
或其他任何变量,然后您可以将 above
设置为 YES
如果您想要所有内容比阈值更高(即更亮),或者 NO
如果你想要一切都更低(即更暗)。
问题是,我以前从未做过图像处理或绘图,所以我不知道如何设置该方法。我有一种模糊的感觉,它会涉及 UIGraphicsBeginImageContext
等,但我无法根据另一张图像的亮度找到任何使用它的问题或教程。
我将如何着手制作这样的方法?或者在 iOS 中是否有一些预先存在的系统来处理高度图,这使得这一切比我处理它要容易得多?
经过几个小时的摸索,我拼凑出了这个方法。如果其他人需要做类似的事情,就在这里。一步一步来,我还是不太明白它在做什么,但最终的结果是我想要的。
-(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 之间,超出该范围的所有内容都变得完全透明。
我有一个高度图(灰度图像,黑色为最低区域,白色为最高区域),我试图隔离高于或低于特定阈值的所有内容。我的目标是能够获取任何高度贴图,并且 return 一个新的 UIImage,其中低于特定高度(即比给定颜色更暗)的所有内容都被复制,但高于(即更亮)的任何内容都是透明的。
现在我对此很陌生,所以如果有更好的方法来解决这个问题,我很想听听,但我的第一直觉是创建一个具有相同框架的新 UIImage,然后绘制根据原件中给定区域的亮度加入其中。像...
-(UIImage*)mapIsolatedFromThreshold:(CGFloat)threshold showAbove:(BOOL)above;
因此,threshold
变量可以是 0.7
或 0.2
或其他任何变量,然后您可以将 above
设置为 YES
如果您想要所有内容比阈值更高(即更亮),或者 NO
如果你想要一切都更低(即更暗)。
问题是,我以前从未做过图像处理或绘图,所以我不知道如何设置该方法。我有一种模糊的感觉,它会涉及 UIGraphicsBeginImageContext
等,但我无法根据另一张图像的亮度找到任何使用它的问题或教程。
我将如何着手制作这样的方法?或者在 iOS 中是否有一些预先存在的系统来处理高度图,这使得这一切比我处理它要容易得多?
经过几个小时的摸索,我拼凑出了这个方法。如果其他人需要做类似的事情,就在这里。一步一步来,我还是不太明白它在做什么,但最终的结果是我想要的。
-(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 之间,超出该范围的所有内容都变得完全透明。