使用iPhone的蜡笔效果

时间:2011-06-28 06:46:18

标签: iphone objective-c ipad ios4

我正在开发的应用程序允许用户使用手指作为蜡笔填充图形中的颜色。有人能帮助我产生蜡笔效果吗? 提前谢谢。

3 个答案:

答案 0 :(得分:0)

您可以参考下面给出的链接开始。在这里,您可以通过提供教程中给出的RGB值来更改笔颜色或蜡笔颜色。

http://www.ifans.com/forums/showthread.php?t=132024

您可以在屏幕上提供代表不同颜色的按钮,根据点击的按钮,您可以设置当前笔的RGB值并用手将颜色归档。

希望这会对你有所帮助。

答案 1 :(得分:0)

您将在drawRect中使用的标准Quartz调用:实际上不会为您提供使用任何默认行为寻找的蜡笔效果。

最简单的实现方法是创建一系列透明的蜡笔纹理。 Photoshop,Fireworks和许多其他绘图应用程序已经有用于蜡笔效果的画笔和线条样式,因此您可以简单地在透明背景上使用其中的一些来获得一些可行的“斑点”(小圆形蜡笔看起来透明的PNG)

然后,当用户在设备上拖动手指时,记录路径并沿路径绘制这些“splotch”图像。如果这个人来回抽出,会有更多的颜色,你会得到一个更暗(更坚固/更透明)的颜色。

这是解决此问题的一种非常粗略但常见的方法。你可以通过蒙版,模式,渐变和其他Quartz方法变得非常聪明,但是提供你想要的东西的复杂性可能会超出图像方法的简单性。

可以获得最佳效果的一些建议:

  1. 您可以使用HSV(色调饱和度值)从单个初始图像集创建一系列颜色变化,以获得各种蜡笔颜色。这可以在代码或图形程序中完成。
  2. 在图像中添加一些非常浅的灰度阴影会使它们的深度和粗糙度即使多次叠加图像也会保留,并且在进行HSV调整时灰度不会被过滤掉。这可以防止蜡笔变成纯色。
  3. 在人物拖动时连续记录您的路径,(x,y),大小,“斑点”选项和颜色,但是,根据触摸下降/向上或最大尺寸将其分解为多个部分,就像您一样可以提供一步一步的“撤消”功能。
  4. 您可以将(3)中的“段”转换为单个图像,方法是将它们渲染到屏幕外缓冲区。这将允许您仅使用几个透明图像重绘整个部分,而不是每次都重绘数千个小“斑点”。
  5. 如果您熟悉OpenGL,即使对于2D,您也可以获得良好的性能提升,因为它可以操作“splotch”源图像,屏幕外渲染和使用少量代码进行分层,然后您必须在CoreGraphics中进行操作。不幸的是,设置OpenGL会增加大量代码并且可能非常混乱。
  6. 希望这很清楚,并给你一些想法。

    请记住,一旦掌握了这种方法,您就可以绘制任何东西。除了蜡笔纹理,你可以拥有霓虹灯,星星,粒子效果,以及你能想象到的任何东西。

答案 2 :(得分:0)

尝试

class myView {

var crayon = UIColor(patternImage: UIImage(named: "acrayontexture")!)

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {      firstTouch = (touches.first?.location(in: self))!       aPath.move(to: firstTouch)

} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if firstTouch != lastTouch {
        lastTouch = (touches.first?.location(in: self))! ;
         aPath.addLine(to: lastTouch)

        setNeedsDisplay()
        }
 override func draw(_ rect: CGRect) {

    let context = UIGraphicsGetCurrentContext() ;
    context?.addPath(aPath)
    context?.setLineWidth(10.0)
    context?.setStrokeColor(crayon.cgColor) ;
    context?.setLineCap(.round)
    context?.setShadow(offset: CGSize(width: 5.0 , height: 4.0), blur: 4.0) ;
    //
    context?.strokePath()

}

    }    
}

`