我在将照片剪辑到自定义UIBezierPath时遇到问题。它不是显示路径中的区域,而是显示照片的另一部分(不同的大小和位置,而不是它应该的位置,但仍然与绘制的形状相同)。注意我还想保持原始照片的完整质量。
我在下面添加了照片和标题,以便更深入地解释我的问题。如果有人能给我另一种方式来做这样的事情,我很乐意重新开始。
以上是UIImageView中UIImage的图示,所有这些都在UIView中,其中显示UIBezierPath的CAShapeLayer是子层。对于此示例,假设用户绘制了红色路径。
在此图中是CAShapeLayer和使用原始图像大小创建的图形上下文。如何剪切上下文以便生成下面的结果(请原谅它的混乱)?
这是我想在完成所有工作后制作的结果。注意我希望它仍然与原始尺寸/质量相同。
以下是我的代码的一些相关部分:
将图像剪辑为路径
-(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();
}
答案 0 :(得分:1)
您收到的裁剪不正确,因为缩放UIImage
以适应UIImageView
。基本上这意味着您必须将UIBezierPath
坐标转换为UIImage
内的正确坐标。最简单的方法是使用UIImageView
类别,它将点从一个视图(在这种情况下为UIBezierPath
,即使它不是真正的视图)转换为{中的正确点{1}}。
您可以看到此类别here的示例。更具体地说,您需要使用该类别中的UIImageView
方法转换convertPointFromView:
中的每个点。
(抱歉没有写完整的代码,我在手机上打字)