使UIImage的一部分透明,或裁剪该区域

时间:2013-11-16 18:35:28

标签: ios objective-c

我有一个像这样的UIImage: enter image description here

我想删除中间的一个矩形,就像这样: enter image description here

3 个答案:

答案 0 :(得分:10)

打孔的最简单方法是添加图层蒙版。

  • #import <QuartzCore/QuartzCore.h>
  • 创建要剪辑的路径(您想要穿过的矩形)

    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRect:yourView.bounds];
    [maskPath appendPath:[UIBezierPath bezierPathWithRect:rectToPunchThroughTheView]];
    
  • 然后创建一个遮罩层并将其添加到您的视图中 - CAShapeLayer将允许您定义任何路径

    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.fillRule  = kCAFillRuleEvenOdd;
    maskLayer.fillColor = [UIColor blackColor].CGColor;
    maskLayer.path      = maskPath.CGPath;
    
    yourView.layer.mask = maskLayer;
    

答案 1 :(得分:2)

我会创建一个UIImage类别,并使用不同的rects裁剪图像两次。

这是我刚刚在我的UIImage类别中添加的方法,它符合我的需求:

- (UIImage *)cropWithRect:(CGRect)rect {

    // If run on a retina device scale is 2 else 1
    rect = CGRectMake(rect.origin.x * self.scale,
                      rect.origin.y * self.scale,
                      rect.size.width * self.scale,
                      rect.size.height * self.scale);

    CGImageRef imgRf = CGImageCreateWithImageInRect(self.CGImage, rect);
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef 
                                                scale:self.scale
                                          orientation:self.imageOrientation];
    CGImageRelease(imageRef);

    return croppedImage;

}

答案 2 :(得分:1)

你可以这样做

        CGRect fullimageRect;
        CGRect upperRect;
        CGRect lowerRect;

        UIImage *upperImage;
        UIImage *lowerImage;
        UIImage *finalImage;

        UIGraphicsBeginImageContext(upperRect.size);
        [[UIImage imageNamed:@"yourimage.png"] drawInRect:lowerRect];
        upperImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();


        UIGraphicsBeginImageContext(lowerRect.size);
        [[UIImage imageNamed:@"yourimage.png"] drawInRect:lowerRect];
        lowerImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        NSLog(@"%@",upperImage);
        NSLog(@"%@",lowerImage);


        UIGraphicsBeginImageContext(fullimageRect.size);
        [upperImage drawInRect:upperRect];
        [lowerImage drawInRect:lowerRect];
        finalImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        NSLog(@"%@",finalImage);