【问题标题】:Is it possible to draw to individual channels with Core Graphics?是否可以使用 Core Graphics 绘制到单个通道?
【发布时间】:2019-11-12 15:30:43
【问题描述】:

我想使用 Core Graphics 在特定通道中绘图。

使用下面的代码,每个形状都使用单一通道颜色绘制,但第二个绿色填充矩形将覆盖之前的红色椭圆。我希望一个椭圆仅在红色通道中,而正方形仅在绿色通道中。我尝试使用透明层,但没有帮助。

UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
let context = UIGraphicsGetCurrentContext()!
let circlePath = UIBezierPath(ovalIn: CGRect(x: 0.0, y: 0.0, width: 50.0, height: 50))
let squarePath = UIBezierPath(rect: CGRect(x: 0.0, y: 0.0, width: 50.0, height: 50))

UIColor.red.setFill()
circlePath.fill()

UIColor.green.setFill()
squarePath.fill()

是否可以在单个频道中绘制?还是我必须绘制单独的位图并在像素级别组合它们?

【问题讨论】:

  • 画到个别频道是徒劳的。即使你能做到,它也只能用于绘制红色、绿色和蓝色的椭圆。任何其他颜色都需要瞬态才能正常工作,所以你应该直接这样做。 UIColor.greeen.setFill() 正在设置不透明的绿色,这就是您看到这种覆盖行为的原因。
  • 所示示例过于简单化。我需要能够为不同的通道绘制不同的形状,并在特定的通道中绘制位图。据我所知,透明度没有帮助。
  • (假设我正确理解了这个问题)没关系。您只有 3 个颜色通道来模拟 3 个固定颜色(r、g、b)。使用这些,您只能混合纯红色或纯绿色或纯蓝色的图像。例如,您不能使用这种技术在一些半透明的紫色对象后面绘制一个半透明的对象。

标签: ios swift core-graphics channel


【解决方案1】:

您需要使用fill(with:alpha:),而不是使用UIBezierPath.fill()(将贝塞尔路径绘制为完全不透明),它允许您将自定义不透明度指定为CGFloat,介于0(完全透明)和1(完全不透明)。

有多种混合模式可用(请参阅CGBlendMode),它们指定部分透明的表面如何相互作用。 Multiply 是一个“合理的默认设置”,但您可以尝试使用它们,看看哪个最符合您的设计。混合模式和Photoshop等一样,所以网上有很多教程、解释和示例,比如https://photoshoptrainingchannel.com/blending-modes-explained/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多