1

我有一个带有一些文本的 UIImage 并且想应用模式 UIImage 作为掩码。这可能吗 ?我知道使用 UILabel 我们可以使用 CAGradientLayer 获得这种渐变。但是如果源是 UIImage 可以做到这一点吗?

除了常规字符和 UIImage 之外,图像可能还有一些符号/图片等。我也可以通过根据上下文应用不同的掩码模式来重用图像。

这可能吗 ?

感谢你的帮助。

编辑:感谢您的所有回答。我了解将渐变应用于文本标签或创建包含文本的图像。但我的目标是得到这个。-->点击这里

即我有一个png,上面有一些像透明背景的花一样的图画。我想在运行时使用 gradient.png 将渐变应用于该图片内的对象,如上图所示。这可能与掩蔽吗?

谢谢

4

4 回答 4

3

看起来你应该能够使用 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

于 2011-02-06T08:39:27.483 回答
0

这只是另一种绘制文本图像的方法来掩盖某些东西。它基于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();
于 2011-02-06T14:32:38.790 回答
0

是的 :)

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

如果你想要严格控制,Jason Whyne 的想法可能会奏效。但我喜欢这个,因为它短了大约 8 行。

于 2011-02-06T08:41:37.667 回答
0

使用面具的样本很好并且效果很好,但是你正在泄漏。CGImageMaskCreate 和 CGI​​mageCreateWithMask 进行分配(遵循“创建”-> 保留规则),因此您应该在使用后释放掩码和图像:

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

根据 ADC 文档: ... 返回值 一个 Quartz 位图图像掩码。你负责通过调用 CGImageRelease 来释放这个对象。

于 2012-01-22T10:26:45.573 回答