【发布时间】:2016-12-18 13:53:54
【问题描述】:
我想用颜色参考为图像着色。结果应该类似于 Photoshop 中的正片叠底混合模式,其中 whites 将被替换为 tint:
我会不断改变颜色值。
跟进:我会将执行此操作的代码放在 ImageView 的 drawRect: 方法中,对吧?
与往常一样,代码 sn-p 将极大地帮助我理解,而不是链接。
更新:使用建议的代码 Ramin 子类化 UIImageView。
我把它放在我的视图控制器的 viewDidLoad: 中:
[self.lena setImage:[UIImage imageNamed:kImageName]];
[self.lena setOverlayColor:[UIColor blueColor]];
[super viewDidLoad];
我看到了图像,但它没有被着色。我还尝试加载其他图像,在 IB 中设置图像,并在我的视图控制器中调用 setNeedsDisplay:。
更新:drawRect:没有被调用。
最终更新:我发现了一个旧项目,它的 imageView 设置正确,因此我可以测试 Ramin 的代码,它就像一个魅力!
最终的、最终的更新:
对于那些刚刚学习 Core Graphics 的人来说,这是最简单的方法。
在您的子类 UIView 中:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColor(context, CGColorGetComponents([UIColor colorWithRed:0.5 green:0.5 blue:0 alpha:1].CGColor)); // don't make color too saturated
CGContextFillRect(context, rect); // draw base
[[UIImage imageNamed:@"someImage.png"] drawInRect: rect blendMode:kCGBlendModeOverlay alpha:1.0]; // draw image
}
【问题讨论】:
-
我添加了 sn-p,然后将其发布到我坐在那里的一些旧的 drawRect 代码中,它运行良好。可能想在没有 [super viewDidLoad] 调用的情况下尝试它(或将其移至上方)。还要仔细检查以确保分配此对象的人分配的是派生版本而不是普通 UIImageView(即,如果它加载到 nib、分配器等中)。
-
如果上述方法不起作用,另一个建议是:不要将 UIImageView 子类化为普通 UIView 并添加可以设置的 overlayColor 和名为“image”的 UIImage 属性。然后把drawRect放在那里。 drawRect 代码不关心 'image' 值是来自 UIImageView 还是来自您定义的属性。
-
如果图像带有 alpha,这不会失败吗?如果我只想为图像的绘制部分着色怎么办? (就像 UIButton 一样?)
标签: ios cocoa-touch image-processing uiimage tint