2

我正在做一个项目,我需要点击创建封闭 UIBezierPath 的图像。路径关闭后,我在路径内绘制了一个图案。使用底部的滑块,我可以设置将填充路径的图案的缩放级别。我现在正在研究图案的透视变形,但我无法理解。

模式是这样创建的

UIImage *originalImage = [UIImage imageNamed:@"tegole.jpg"];
UIImage *scaledImage = [UIImage imageWithCGImage:[originalImage CGImage]
                        scale:(originalImage.scale * _zoom)
                  orientation:(originalImage.imageOrientation)];
UIColor *patternImage = [UIColor colorWithPatternImage:scaledImage];
[patternImage setFill];
[_path fill];

有没有人对实现这一目标的更好方法有任何建议?我在看 opencv.framework ?这可能是一个解决方案吗?

4

1 回答 1

1

我最近一直在做类似的事情,但我使用的是 NSBezierPath 而不是 UIBezierPath ......虽然它们应该是等价的。我想用位图图像填充六边形的内部。我正在用六边形瓷砖写一个电脑棋盘游戏。

我创建了一个六边形路径,如下所示:

    let path = NSBezierPath()
    let rads = CGFloat(Double.pi) / 180.0
    var p = NSPoint(x: scale*cos(30 * rads) + x, y: scale*sin(30 * rads) + y)
    path.move(to: p)
    p = NSPoint(x: scale*cos(90 * rads) + x, y: scale*sin(90 * rads) + y)
    path.line(to: p)
    p = NSPoint(x: scale*cos(150 * rads) + x, y: scale*sin(150 * rads) + y)
    path.line(to: p)
    p = NSPoint(x: scale*cos(210 * rads) + x, y: scale*sin(210 * rads) + y)
    path.line(to: p)
    p = NSPoint(x: scale*cos(270 * rads) + x, y: scale*sin(270 * rads) + y)
    path.line(to: p)
    p = NSPoint(x: scale*cos(330 * rads) + x, y: scale*sin(330 * rads) + y)
    path.line(to: p)
    p = NSPoint(x: scale*cos(30 * rads) + x, y: scale*sin(30 * rads) + y)
    path.line(to: p)

    path.lineWidth = 3.5

...然后我简单地添加了:

    path.setClip()

    let mainBundle: Bundle = Bundle.main
    imagePath = mainBundle.pathForImageResource("Swatch1.png")!
    let gSwatch1 = NSImage(contentsOfFile:imagePath)!

    gSwatch1.draw(in: path.bounds)

...这会在六边形路径的范围内绘制图像“Swatch1.png”。

您可以通过更改目标的边界 Rect 来缩放图像,但您也可以使用 NSAffineTransform 等应用任何其他转换。

于 2018-11-23T19:44:48.490 回答