2015-08-13 8 views
0

У меня есть карта высоты (изображение в градациях серого, с черным как самое низкое и белое, как самые высокие области), и я пытаюсь изолировать все выше или ниже определенного порога. Моя цель состоит в том, чтобы иметь возможность принимать любую карту высот и возвращать новый UIImage, где все под определенной высотой (т. Е. Темнее, чем заданный цвет) копируется, но что-либо выше (то есть светлее) просто прозрачно.Стереть UIImage легкостью?

enter image description here

Теперь я новичок в этом, так что если есть лучший способ пойти об этом я хотел бы услышать это, но мой первый инстинкт, чтобы создать новый UIImage с той же рамкой , а затем нарисуйте его на основе легкости данной области в оригинале. Что-то вроде ...

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

Таким образом, переменная threshold может быть 0.7 или 0.2 или любой другой, а затем вы можете установить above в YES, если вы хотите, чтобы все больше (то есть легче), чем порог, или NO, если вы хотите, чтобы все было ниже (т.е. темнее).

Дело в том, что я никогда не делал обработку изображения или рисования раньше, поэтому я не знаю, как настроить этот метод. У меня есть смутное чувство, что это будет связано с UIGraphicsBeginImageContext и такими, но я не смог найти никаких вопросов или руководств, которые используют его на основе легкости другого изображения.

Как я могу сделать такой метод? Или есть какая-то уже существовавшая система для обработки карт высот в iOS, что делает это намного проще, чем я это рассматриваю?

ответ

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, и все за пределами этого диапазона становится полностью прозрачным.