绘制矩形时如何避免颜色混合?

Posted

技术标签:

【中文标题】绘制矩形时如何避免颜色混合?【英文标题】:How to avoid color blending while drawing rectangles? 【发布时间】:2012-01-31 11:12:23 【问题描述】:

ios 的 UIView 中绘制矩形时,我一直遇到同样的问题:矩形边距将它们的颜色与背景混合。我尝试了几种矩形绘制方法,结果相同——使用贝塞尔路径,逐行绘制,绘制边距并填充矩形内部。

视图的框架本身总是正确绘制的。我什至考虑过在需要矩形时使用视图,但这似乎不是专门做事的正确方法,因为我需要绘制许多视图。

这是我的问题的一个例子。为了比较,我正在绘制一个具有相同尺寸的矩形绿色视图:

CGRect horizontalBar = CGRectMake(2, 2, 10, 6);

UIView* horizontalBarSubView = [[UIView alloc] initWithFrame:horizontalBar];
horizontalBarSubView.backgroundColor = [UIColor greenColor];
[self addSubview:horizontalBarSubView];
[horizontalBarSubView release];

对于矩形本身:

CGRect horizontalBar = CGRectMake(2, 20, 10, 6);

UIBezierPath* horizontalBarPath = [UIBezierPath bezierPathWithRect:horizontalBar];
[[UIColor greenColor] set];
[horizontalBarPath fill];

这会产生以下结果(10 倍缩放):

是什么导致颜色混合?

如何避免这种情况?

【问题讨论】:

【参考方案1】:

@Almo 是正确的,您的问题是抗锯齿,但您确定这是实际的代码和值吗?这不应该抗锯齿,我的测试表明它没有。为了得到你的结果,我必须改变你的路径:

CGRect horizontalBar = CGRectMake(2.5, 20.5, 10, 6);

填充小数像素上的路径将为您提供您所看到的效果。此外,在具有奇数宽度的整数像素上抚摸路径将以这种方式消除锯齿。 (全部在非 Retina 显示屏上;Retina 略有不同。)

我通常不建议像@Almo 建议的那样关闭抗锯齿功能。相反,您只需要确保您的路径绘制或填充整个像素。

这在iOS 5 Programming Pushing the Limits 的第 6 章第 114 页中有更详细的介绍。

【讨论】:

你是对的,我在一个视图中绘制,该视图已经在两个轴上设置了半个像素。【参考方案2】:

你试过弄乱 CGContext 吗?

CGContextSetShouldAntialias

在此处查看图形上下文设置:

http://www.apeth.com/iOSBook/ch15.html

“在图形上下文中绘制时,绘制遵循上下文的当前设置。因此,过程始终是先配置上下文的设置,然后再绘制。”

您需要一个没有设置 CGContextSetShouldAntialias 标志的上下文。

尽管如 cmets 中所述,这将填充原本会与矩形颜色混合的像素。

【讨论】:

这确实有效,尽管矩形最终会填充混合像素,这使得它们(矩形)更厚。 有趣。感谢您的信息!

以上是关于绘制矩形时如何避免颜色混合?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iPhone 中混合来自不同视图的颜色

Alpha 混合和 UIView 背景颜色

使用matplotlib / pyplot混合线条颜色绘制曲线

OpenCV:如何混合多个不同颜色的半透明多边形?

平板涂色

剪辑时如何避免覆盖drawRect