绘制白色会产生透明色
Posted
技术标签:
【中文标题】绘制白色会产生透明色【英文标题】:Drawing a white color results in a transparent color 【发布时间】:2011-10-05 19:52:23 【问题描述】:所以在我的自定义视图中,我尝试使用 Core Graphics 绘制白色/灰色渐变。我有以下代码:
UIColor *color1 = [UIColor whiteColor];
UIColor *color2 = [UIColor colorWithRed:209.0/255.0 green:212.0/255.0 blue:217.0/255.0 alpha:1.0];
CFMutableArrayRef colors = CFArrayCreateMutable(NULL, 0, NULL);
CFArrayAppendValue(colors, color1.CGColor);
CFArrayAppendValue(colors, color2.CGColor);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGFloat locations[2] = 0.0, 1.0;
CGGradientRef gradient = CGGradientCreateWithColors(colorspace, colors, locations);
CGContextDrawLinearGradient(UIGraphicsGetCurrentContext(), gradient, topCenter, bottomCenter, kCGGradientDrawsAfterEndLocation);
我认为这段代码相当简单,应该会产生漂亮的白色/灰色渐变。但事实并非如此;它绘制一个透明/灰色渐变。
我认为这可能与视图的背景颜色有关,即[UIColor clearColor]
。但我无法改变这一点,因为我需要让我的视图的某些部分是透明的。
有什么想法吗?
【问题讨论】:
看这个***.com/questions/3060010/… 好像相关,但不是确切的问题,所以不想标记为重复。 当您将背景颜色从清晰的颜色更改为白色时,看起来是否正确? 是的,但不幸的是,这不是我的选择 我阅读了另一个问题,确实,这似乎是色彩空间的问题。我将CGColorSpaceCreateDeviceRGB()
更改为CGColorSpaceCreateDeviceGray()
并且有效;白色现在正确显示。但这不是意味着只显示灰色吗?我该如何解决?
【参考方案1】:
UIColor *color1 = [UIColor whiteColor];
上面的行可能会在灰度色彩空间中创建一种颜色。
试试这个:
UIColor *color1 = [UIColor colorWithRed:1.f green:1.f blue:1.f alpha:1.f];
【讨论】:
【参考方案2】:UIColors 可以导致在不同颜色空间中定义的颜色。白色将是单色。
这段代码演示了如何处理它。
CGColorSpaceRef fillColorSpace = CGColorGetColorSpace([self.fillColor CGColor]);
const float* fillColors = CGColorGetComponents([self.fillColor CGColor]);
if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelRGB)
CGContextSetRGBFillColor(contextRef, fillColors[0],fillColors[1], fillColors[2], fillColors[3]);
else if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelMonochrome)
CGContextSetGrayFillColor(contextRef, fillColors[0], fillColors[1]);
您也可以使用这种方法将单色颜色转换为 RGB 颜色:
if (CGColorSpaceGetModel(fillColorSpace) == kCGColorSpaceModelMonochrome)
const float* colors = CGColorGetComponents([self.fillColor CGColor]);
self.fillColor = [UIColor colorWithRed:colors[0]
green:colors[0]
blue:colors[0]
alpha:colors[1]];
现在颜色是RGB,所以你不需要区分不同颜色模型的CG函数。
const float* fillColors = CGColorGetComponents([self.fillColor CGColor]);
CGContextSetRGBFillColor(contextRef, fillColors[0],fillColors[1], fillColors[2], fillColors[3]);
【讨论】:
以上是关于绘制白色会产生透明色的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用ggplot2包使用geom_density()函数绘制分组密度图(填充色配置半透明填充色添加均值线)实战(density plot)