Возможен ли этот вид маскировки с помощью UIImage или CGImage API в iOS - PullRequest
1 голос
/ 06 февраля 2011

У меня есть UIImage с некоторым текстом и я хотел бы применить шаблон UIImage в качестве маскировки. Это возможно ? Я понимаю, что с помощью UILabel мы можем получить такой градиент, используя CAGradientLayer. Но можно ли это сделать, если источником является UIImage?

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

возможно ли это?

Ценю вашу помощь.

РЕДАКТИРОВАТЬ: Спасибо за все ваши ответы. Я понимаю, применяя градиент к текстовой метке или создавая изображение с текстом. Но моя цель - получить это .--> Нажмите здесь

т.е. У меня есть PNG с рисунком, как цветок с прозрачным фоном. Я хочу применить градиент к объекту внутри этого изображения во время выполнения с помощью Gradient.png, как показано на рисунке выше. Это возможно с маскировкой?

Спасибо

Ответы [ 4 ]

3 голосов
/ 06 февраля 2011

Похоже, вы должны иметь возможность использовать CGImageMaskCreate:

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {

    CGImageRef maskRef = maskImage.CGImage; 

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
        CGImageGetHeight(maskRef),
        CGImageGetBitsPerComponent(maskRef),
        CGImageGetBitsPerPixel(maskRef),
        CGImageGetBytesPerRow(maskRef),
        CGImageGetDataProvider(maskRef), NULL, false);

    CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);
    return [UIImage imageWithCGImage:masked];

}

Для более длительного обсуждения проверьте ветку комментариев здесь: http://iosdevelopertips.com/cocoa/how-to-mask-an-image.html

0 голосов
/ 22 января 2012
Образец

с использованием маски в порядке и работает хорошо, но Вы протекаете.CGImageMaskCreate и CGImageCreateWithMask выделяют (следуя правилу «создать» -> сохранить), поэтому вы должны освободить маску и изображение после использования:

CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);
UIImage * result =  [UIImage imageWithCGImage:masked];
CGImageRelease(mask);
CGImageRelease(masked);
return result;

Согласно документам АЦП: ... Возвращаемое значение Маска кварцевого растрового изображения.Вы несете ответственность за освобождение этого объекта, вызывая CGImageRelease.

0 голосов
/ 06 февраля 2011

Вот еще один способ нарисовать изображение, маскирующее текст.Он основан на режиме смешивания kCGBlendModeSourceIn: вы рисуете текст на чистом фоне, а затем рисуете заливку повсюду.

NSString *theString = ...;
UIFont *theFont = ...;
CGSize stringSize = [theString sizeWithFont:theFont];

// The background must be clear (fully transparent), hence NO as the 2nd argument
UIGraphicsBeginImageContextWithOptions(stringSize, NO, 0);
[theString drawAtPoint:CGPointZero withFont:theFont];
// This effectively colorizes the image. Use a pattern color...
[patternColor set];
UIRectFillUsingBlendMode(CGRectMake(0, 0, stringSize.width, stringSize.height), kCGBlendModeSourceIn);
// ... or an image:
[patternImage drawInRect:CGRectMake(0, 0, stringSize.width, stringSize.height) blendMode:kCGBlendModeSourceIn alpha:1.0f];

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
0 голосов
/ 06 февраля 2011

Да, это:)

textField.textColor = [UIColor colorWithPatternImage:<br>                                    [UIImage imageNamed:@"rainbowGradient.png"]];

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

...