我需要一个UIImageView,它可以根据标志用彩色或黑白绘制自己:
BOOL isGrey;
我正在尝试通过在Quartz blendmode设置为Color的情况下在原始图像上绘制一个黑色矩形来实现。这有效,除了它不尊重图像的alpha蒙版。
见插图: alt text http://img214.imageshack.us/img214/1407/converttogreyscaleillo.png
搜索谷歌和搜索引擎优化,我发现并尝试了几种解决方案,但没有人尊重这种模式。
以下代码生成上面的“我得到的”图片:
- (void)drawRect:(CGRect)rect {
if (isGrey) {
CGContextRef context = UIGraphicsGetCurrentContext();
// flip orientation
CGContextTranslateCTM(context, 0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
// draw the image
CGContextDrawImage(context, self.bounds, self.image.CGImage);
// set the blend mode and draw rectangle on top of image
CGContextSetBlendMode(context, kCGBlendModeSaturation);
CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0);
CGContextFillRect(context, rect);
} else {
[self.image drawInRect:rect];
}
}
是否有一些我忘记设置的石英绘图模式?我看过石英编程指南,但很难从重叠和超链接主题中提取出你需要的一点信息。
显然我正在寻找适用于任何蒙版形状图像的通用解决方案,而不仅仅是所示的圆圈。
答案 0 :(得分:10)
要在尊重图像的alpha蒙版时绘制形状,只需在绘制之前添加一行:
CGContextClipToMask(context, self.bounds, image.CGImage);
// example usage
- (void)drawRect:(CGRect)rect {
if (isGrey) {
CGContextRef context = UIGraphicsGetCurrentContext();
// flip orientation
CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
// draw the image
CGContextDrawImage(context, self.bounds, self.image.CGImage);
// set the blend mode and draw rectangle on top of image
CGContextSetBlendMode(context, kCGBlendModeColor);
CGContextClipToMask(context, self.bounds, image.CGImage); // respect alpha mask
CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0);
CGContextFillRect(context, rect);
} else {
[self.image drawInRect:rect];
}
}
答案 1 :(得分:1)
虽然它没有直接回答您的问题,但您可以使用kCGBlendModeLuminosity
混合模式获得您想要的效果:
- (void)drawRect:(CGRect)rect {
CGSize imageSize = [image size];
CGContextRef c = UIGraphicsGetCurrentContext();
if (isGrey)
CGContextSetBlendMode(c, kCGBlendModeLuminosity);
CGContextScaleCTM(c, 1.0, -1.0);
CGContextDrawImage(c, CGRectMake(0.0f, 0.0f, imageSize.width, -imageSize.height), [image CGImage]);
}
此外,传递给drawRect:
的矩形是无效区域,而不是整个区域。您应该使用bounds
而不是
答案 2 :(得分:1)
我会采取简单的方法,绘制一个与您拥有的圆形图像大小相同的黑色圆圈。可能不是你要求的。
答案 3 :(得分:0)
您可以尝试将遮罩添加到视图的核心动画层。
CALayer *maskLayer = [CALayer layer];
[maskLayer setBounds:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
// Center the layer
[maskLayer setPosition:CGPointMake([self view].bounds.size.width/2,
[self view].bounds.size.height/2)];
// Set the cornerRadius to half the width/height to get a circle.
[maskLayer setCornerRadius:50.f];
[maskLayer setMasksToBounds:YES];
// Any solid color will do. Just using black here.
[maskLayer setBackgroundColor:[[UIColor blackColor] CGColor]];
// Set the mask which will only allow that which is in the
// circle show through
[[[self view] layer] setMask:maskLayer];
另一个想法。为什么你不能只创建一个b& w版本的图像并根据你的旗帜交换出来?