【问题标题】:Erase UIImage by lightness?通过亮度擦除 UIImage?
【发布时间】:2015-08-13 17:29:38
【问题描述】:

我有一个高度图(灰度图像,黑色作为最低区域,白色作为最高区域),我试图隔离高于或低于某个阈值的所有内容。我的目标是能够获取任何高度图,并返回一个新的 UIImage,其中复制了低于特定高度(即比给定颜色深)的所有内容,但高于(即更亮)的所有内容都是透明的。

现在我对此很陌生,所以如果有更好的方法来解决这个问题,我很想听听,但我的第一直觉是创建一个具有相同框架的新 UIImage,然后在其中绘制基于原件中给定区域的亮度。比如……

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

因此,threshold 变量可以是 0.70.2 或其他任何值,如果您希望所有内容都高于(即更轻)阈值,则可以将 above 设置为 YES,或者 @987654329 @如果你想要一切都更低(即更暗)。

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

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

【问题讨论】:

    标签: ios objective-c uiimage uigraphicscontext heightmap


    【解决方案1】:

    经过几个小时的搜寻,我能够拼凑出这个方法。如果其他人需要做类似的事情,就在这里。我还没有完全理解它在做什么,一步一步来,但最终的结果就是我想要的。

    -(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 之间的值,超出该范围的所有内容都变得完全透明。

    【讨论】:

      猜你喜欢
      • 2012-12-12
      • 2019-09-12
      • 2016-08-19
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多