在保留图像质量的同时将UIImage剪切为自定义UIBezierPath

时间:2014-01-12 06:38:59

标签: ios objective-c core-graphics quartz-core cashapelayer

我在将照片剪辑到自定义UIBezierPath时遇到问题。它不是显示路径中的区域,而是显示照片的另一部分(不同的大小和位置,而不是它应该的位置,但仍然与绘制的形状相同)。注意我还想保持原始照片的完整质量。

我在下面添加了照片和标题,以便更深入地解释我的问题。如果有人能给我另一种方式来做这样的事情,我很乐意重新开始。

The user draws a UIBezierPath with his finger 以上是UIImageView中UIImage的图示,所有这些都在UIView中,其中显示UIBezierPath的CAShapeLayer是子层。对于此示例,假设用户绘制了红色路径。

Visualization 在此图中是CAShapeLayer和使用原始图像大小创建的图形上下文。如何剪切上下文以便生成下面的结果(请原谅它的混乱)?

The result 这是我想在完成所有工作后制作的结果。注意我希望它仍然与原始尺寸/质量相同。

以下是我的代码的一些相关部分:

将图像剪辑为路径

-(UIImage *)maskImageToPath:(UIBezierPath *)path {
    // Precondition: the path exists and is closed
    assert(path != nil);


    // Mask the image, keeping original size
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0);

    [path addClip];
    [self drawAtPoint:CGPointZero];

    // Extract the image
    UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return maskedImage;
}

这会为UIBezierPath添加点

 - (void)drawClippingLine:(UIPanGestureRecognizer *)sender {
    CGPoint nextPoint = [sender locationInView:self];

    // If UIBezierPath *clippingPath is nil, initialize it.
    // Otherwise, add another point to it.
    if(!clippingPath) {
        clippingPath = [UIBezierPath bezierPath];
        [clippingPath moveToPoint:nextPoint];
    }
    else {
        [clippingPath addLineToPoint:nextPoint];
    }

    UIGraphicsBeginImageContext(_image.size);
    [clippingPath stroke];
    UIGraphicsEndImageContext();


}

1 个答案:

答案 0 :(得分:1)

您收到的裁剪不正确,因为缩放UIImage以适应UIImageView。基本上这意味着您必须将UIBezierPath坐标转换为UIImage内的正确坐标。最简单的方法是使用UIImageView类别,它将点从一个视图(在这种情况下为UIBezierPath,即使它不是真正的视图)转换为{中的正确点{1}}。 您可以看到此类别here的示例。更具体地说,您需要使用该类别中的UIImageView方法转换convertPointFromView:中的每个点。 (抱歉没有写完整的代码,我在手机上打字)