用路径剪切图像的不同部分

时间:2010-04-18 06:46:03

标签: iphone quartz-graphics

我最近问了一个关于在view的drawRect方法中通过路径剪切图像的问题。

iPhone clip image with path

Krasnyk的代码复制如下。

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGMutablePathRef path = CGPathCreateMutable();
//or for e.g. CGPathAddRect(path, NULL, CGRectInset([self bounds], 10, 20));
    CGPathAddEllipseInRect(path, NULL, [self bounds]);
    CGContextAddPath(context, path);
    CGContextClip(context);
    CGPathRelease(path);
    [[UIImage imageNamed:@"GC.png"] drawInRect:[self bounds]];
}

效果很好。但是,当我的图像比视图本身大时,如何显示图像的不同部分?

我尝试在椭圆和/或UIImage drawInRect的位置(显示为上边界)上进行平移,但是我无法解释一些复杂的效果(不需要的剪裁,奇怪的椭圆尺寸)。


编辑:也许我可以回答我自己的问题。我可以试试drawAtPoint而不是drawInRect吗?或者drawInRect并将原点设置为不同的位置,但同时扩展矩形的大小?

当我绘制一个比通过视图显示的更大的矩形时,是否会导致性能损失?

1 个答案:

答案 0 :(得分:2)

听起来你已经为自己想出来了。 drawAtPoint是你应该使用的。 drawInRect将缩放图像以适合目标rect,这在计算上更昂贵。假设您的图像大于您的视图,您将把负x和y值传递给drawAtPoint,以便剪切图像的内部部分。

以下示例应在您的视图中显示图像的中心部分:

- (void)drawRect:(CGRect)rect {
   CGContextRef context = UIGraphicsGetCurrentContext();
   CGMutablePathRef path = CGPathCreateMutable();
   CGPathAddEllipseInRect(path, NULL, [self bounds]);
   CGContextAddPath(context, path);
   CGContextClip(context);
   CGPathRelease(path);
   UIImage *bigImage = [UIImage imageNamed:@"GC.png"];
   CGPoint topLeftOffset = CGPointMake((self.bounds.size.width - bigImage.size.width) / 2,(self.bounds.size.height - bigImage.size.height) / 2);
   [bigImage drawAtPoint: topLeftOffset];

}