绘制白色会产生透明色

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)

Android opengl 画文字,怎么把文字后面的黑色背景去掉

GDIPlus绘制桌面歌词

mfc中让编辑框透明为啥总显示黑色背景的编辑框啊?

android中,如何用canvas绘制透明?

如何绘制一个透明的 NSScroller