首页 文章

裁剪UIImage

提问于
浏览
199

我有一些调整图像大小的代码,所以我可以获得图像中心的缩放块 - 我使用它来获取 UIImage 并返回图像的小方形表示,类似于在专辑视图中看到的照片应用程序 . (我知道我可以使用 UIImageView 并调整裁剪模式以获得相同的结果,但这些图像有时会显示在 UIWebViews 中) .

我已经开始注意到这段代码中的一些崩溃,我有点难过 . 我有两种不同的理论,我想知道是否有基础 .

理论1)我通过绘制到目标大小的屏幕外图像上下文来实现裁剪 . 既然我想要图像的中心部分,我将传递给 drawInRectCGRect 参数设置为's larger than the bounds of my image context. I was hoping this was Kosher, but am I instead attempting to draw over other memory that I shouldn'触及的东西?

理论2)我在后台线程中做了所有这些 . 我知道UIKit的部分内容仅限于主线程 . 我假设/希望绘制到屏幕外的视图不是其中之一 . 我错了吗?

(哦,我多么怀念 NSImage's drawInRect:fromRect:operation:fraction: 方法 . )

23 回答

  • 10

    我对其他解决方案不满意,因为他们要么抽取几次(使用超过必要的功率),要么有方向性问题 . 这是我用于UIImage *图像的缩放方形裁剪图像 .

    CGFloat minimumSide = fminf(image.size.width, image.size.height);
    CGFloat finalSquareSize = 600.;
    
    //create new drawing context for right size
    CGRect rect = CGRectMake(0, 0, finalSquareSize, finalSquareSize);
    CGFloat scalingRatio = 640.0/minimumSide;
    UIGraphicsBeginImageContext(rect.size);
    
    //draw
    [image drawInRect:CGRectMake((minimumSide - photo.size.width)*scalingRatio/2., (minimumSide - photo.size.height)*scalingRatio/2., photo.size.width*scalingRatio, photo.size.height*scalingRatio)];
    
    UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
  • 49

    更新2014-05-28:我写这篇文章的时候iOS 3左右是热门的新东西,我确信现在还有更好的方法可以做到这一点,可能是内置的 . 正如许多人所提到的,这种方法不考虑轮换;阅读一些额外的答案,并传播一些upvote爱,以保持对这个问题的回答对每个人都有帮助 .

    原始回复:

    我打算将我的回复复制/粘贴到其他地方的同一问题:

    没有一个简单的类方法可以做到这一点,但有一个函数可以用来获得所需的结果: CGImageCreateWithImageInRect(CGImageRef, CGRect) 将帮助你 .

    这是一个使用它的简短示例:

    CGImageRef imageRef = CGImageCreateWithImageInRect([largeImage CGImage], cropRect);
    // or use the UIImage wherever you like
    [UIImageView setImage:[UIImage imageWithCGImage:imageRef]]; 
    CGImageRelease(imageRef);
    
  • 1

    要在保持相同比例和方向的同时裁剪视网膜图像,请在UIImage类别(iOS 4.0及更高版本)中使用以下方法:

    - (UIImage *)crop:(CGRect)rect {
        if (self.scale > 1.0f) {
            rect = CGRectMake(rect.origin.x * self.scale,
                              rect.origin.y * self.scale,
                              rect.size.width * self.scale,
                              rect.size.height * self.scale);
        }
    
        CGImageRef imageRef = CGImageCreateWithImageInRect(self.CGImage, rect);
        UIImage *result = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:self.imageOrientation];
        CGImageRelease(imageRef);
        return result;
    }
    
  • 1

    您可以制作UIImage类别并在任何需要的地方使用它 . 根据HitScans的回应和评论吼叫它 .

    @implementation UIImage (Crop)
    
    - (UIImage *)crop:(CGRect)rect {
    
        rect = CGRectMake(rect.origin.x*self.scale, 
                          rect.origin.y*self.scale, 
                          rect.size.width*self.scale, 
                          rect.size.height*self.scale);       
    
        CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], rect);
        UIImage *result = [UIImage imageWithCGImage:imageRef 
                                              scale:self.scale 
                                        orientation:self.imageOrientation]; 
        CGImageRelease(imageRef);
        return result;
    }
    
    @end
    

    你可以这样使用它:

    UIImage *imageToCrop = <yourImageToCrop>;
    CGRect cropRect = <areaYouWantToCrop>;   
    
    //for example
    //CGRectMake(0, 40, 320, 100);
    
    UIImage *croppedImage = [imageToCrop crop:cropRect];
    
  • 64

    Swift 3版

    func cropImage(imageToCrop:UIImage, toRect rect:CGRect) -> UIImage{
    
        let imageRef:CGImage = imageToCrop.cgImage!.cropping(to: rect)!
        let cropped:UIImage = UIImage(cgImage:imageRef)
        return cropped
    }
    
    
    let imageTop:UIImage  = UIImage(named:"one.jpg")! // add validation
    

    enter image description here

    借助这个桥接功能 CGRectMake - > CGRectthis answer回复 @rob mayoff ):

    func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
        return CGRect(x: x, y: y, width: width, height: height)
    }
    

    用法是:

    if var image:UIImage  = UIImage(named:"one.jpg"){
       let  croppedImage = cropImage(imageToCrop: image, toRect: CGRectMake(
            image.size.width/4,
            0,
            image.size.width/2,
            image.size.height)
        )
    }
    

    输出:

    enter image description here

  • 88

    这是我的UIImage裁剪实现,它遵循imageOrientation属性 . 所有方向都经过了彻底的测试 .

    inline double rad(double deg)
    {
        return deg / 180.0 * M_PI;
    }
    
    UIImage* UIImageCrop(UIImage* img, CGRect rect)
    {
        CGAffineTransform rectTransform;
        switch (img.imageOrientation)
        {
            case UIImageOrientationLeft:
                rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(90)), 0, -img.size.height);
                break;
            case UIImageOrientationRight:
                rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-90)), -img.size.width, 0);
                break;
            case UIImageOrientationDown:
                rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-180)), -img.size.width, -img.size.height);
                break;
            default:
                rectTransform = CGAffineTransformIdentity;
        };
        rectTransform = CGAffineTransformScale(rectTransform, img.scale, img.scale);
    
        CGImageRef imageRef = CGImageCreateWithImageInRect([img CGImage], CGRectApplyAffineTransform(rect, rectTransform));
        UIImage *result = [UIImage imageWithCGImage:imageRef scale:img.scale orientation:img.imageOrientation];
        CGImageRelease(imageRef);
        return result;
    }
    
  • 4

    抬头:所有这些答案都假设一个 CGImage -背面的图像对象 .

    image.CGImage 可以返回nil,如果 UIImageCIImage 支持,如果您使用 CIFilter 创建此图像,则会出现这种情况 .

    在这种情况下,您可能必须在新的上下文中绘制图像,并返回该图像(慢) .

    UIImage* crop(UIImage *image, rect) {
        UIGraphicsBeginImageContextWithOptions(rect.size, false, [image scale]);
        [image drawAtPoint:CGPointMake(-rect.origin.x, -rect.origin.y)];
        cropped_image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return cropped_image;
    }
    
  • 1

    这里没有任何答案100%正确处理所有比例和旋转问题 . 这是迄今为止所有内容的综合,是iOS7 / 8的最新版本 . 它意味着作为UIImage类别中的方法包含在内 .

    - (UIImage *)croppedImageInRect:(CGRect)rect
    {
        double (^rad)(double) = ^(double deg) {
            return deg / 180.0 * M_PI;
        };
    
        CGAffineTransform rectTransform;
        switch (self.imageOrientation) {
            case UIImageOrientationLeft:
                rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(90)), 0, -self.size.height);
                break;
            case UIImageOrientationRight:
                rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-90)), -self.size.width, 0);
                break;
            case UIImageOrientationDown:
                rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-180)), -self.size.width, -self.size.height);
                break;
            default:
                rectTransform = CGAffineTransformIdentity;
        };
        rectTransform = CGAffineTransformScale(rectTransform, self.scale, self.scale);
    
        CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], CGRectApplyAffineTransform(rect, rectTransform));
        UIImage *result = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:self.imageOrientation];
        CGImageRelease(imageRef);
    
        return result;
    }
    
  • 32
    CGSize size = [originalImage size];
    int padding = 20;
    int pictureSize = 300;
    int startCroppingPosition = 100;
    if (size.height > size.width) {
        pictureSize = size.width - (2.0 * padding);
        startCroppingPosition = (size.height - pictureSize) / 2.0; 
    } else {
        pictureSize = size.height - (2.0 * padding);
        startCroppingPosition = (size.width - pictureSize) / 2.0;
    }
    // WTF: Don't forget that the CGImageCreateWithImageInRect believes that 
    // the image is 180 rotated, so x and y are inverted, same for height and width.
    CGRect cropRect = CGRectMake(startCroppingPosition, padding, pictureSize, pictureSize);
    CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], cropRect);
    UIImage *newImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:originalImage.imageOrientation];
    [m_photoView setImage:newImage];
    CGImageRelease(imageRef);
    

    我见过的大多数响应只处理(0,0)(x,y)的位置 . 好吧,这是一个案例,但我希望我的裁剪操作集中 . 我花了一段时间才弄明白的是WTF评论之后的界限 .

    让我们以纵向拍摄的图像为例:

    • 原始图像高度高于其宽度(哇,到目前为止还不奇怪!)

    • CGImageCreateWithImageInRect方法在其自己的世界中想象的图像不是真正的肖像,而是景观(这也是为什么如果你不在imageWithCGImage构造函数中使用orientation参数,它将显示为180旋转) .

    • 所以,你应该想象它是一个风景,(0,0)位置是图像的右上角 .

    希望它有意义!如果没有,请尝试使用不同的值,在选择cropRect的正确x,y,宽度和高度时,您会看到逻辑被反转 .

  • 0

    快速扩展

    extension UIImage {
        func crop(var rect: CGRect) -> UIImage {
            rect.origin.x*=self.scale
            rect.origin.y*=self.scale
            rect.size.width*=self.scale
            rect.size.height*=self.scale
    
            let imageRef = CGImageCreateWithImageInRect(self.CGImage, rect)
            let image = UIImage(CGImage: imageRef, scale: self.scale, orientation: self.imageOrientation)!
            return image
        }
    }
    
  • 1

    swift3

    extension UIImage {
        func crop(rect: CGRect) -> UIImage? {
            var scaledRect = rect
            scaledRect.origin.x *= scale
            scaledRect.origin.y *= scale
            scaledRect.size.width *= scale
            scaledRect.size.height *= scale
            guard let imageRef: CGImage = cgImage?.cropping(to: scaledRect) else {
                return nil
            }
            return UIImage(cgImage: imageRef, scale: scale, orientation: imageOrientation)
        }
    }
    
  • 0

    我使用下面的方法 .

    -(UIImage *)getNeedImageFrom:(UIImage*)image cropRect:(CGRect)rect
      {
        CGSize cropSize = rect.size;
        CGFloat widthScale =  
        image.size.width/self.imageViewOriginal.bounds.size.width;
        CGFloat heightScale = 
        image.size.height/self.imageViewOriginal.bounds.size.height;
        cropSize = CGSizeMake(rect.size.width*widthScale,  
        rect.size.height*heightScale);
        CGPoint  pointCrop = CGPointMake(rect.origin.x*widthScale, 
        rect.origin.y*heightScale);
        rect = CGRectMake(pointCrop.x, pointCrop.y, cropSize.width, 
        cropSize.height);
        CGImageRef subImage = CGImageCreateWithImageInRect(image.CGImage, rect);
        UIImage *croppedImage = [UIImage imageWithCGImage:subImage];
        CGImageRelease(subImage);
        return croppedImage;
    

    }

  • 0

    Swift版的 awolf 的答案,对我有用:

    public extension UIImage {
        func croppedImage(inRect rect: CGRect) -> UIImage {
            let rad: (Double) -> CGFloat = { deg in
                return CGFloat(deg / 180.0 * .pi)
            }
            var rectTransform: CGAffineTransform
            switch imageOrientation {
            case .left:
                let rotation = CGAffineTransform(rotationAngle: rad(90))
                rectTransform = rotation.translatedBy(x: 0, y: -size.height)
            case .right:
                let rotation = CGAffineTransform(rotationAngle: rad(-90))
                rectTransform = rotation.translatedBy(x: -size.width, y: 0)
            case .down:
                let rotation = CGAffineTransform(rotationAngle: rad(-180))
                rectTransform = rotation.translatedBy(x: -size.width, y: -size.height)
            default:
                rectTransform = .identity
            }
            rectTransform = rectTransform.scaledBy(x: scale, y: scale)
            let transformedRect = rect.applying(rectTransform)
            let imageRef = cgImage!.cropping(to: transformedRect)!
            let result = UIImage(cgImage: imageRef, scale: scale, orientation: imageOrientation)
            return result
        }
    }
    
  • 1

    Swift 中裁剪UIImage的最佳解决方案,在精度,像素缩放方面......:

    private func squareCropImageToSideLength(let sourceImage: UIImage,
        let sideLength: CGFloat) -> UIImage {
            // input size comes from image
            let inputSize: CGSize = sourceImage.size
    
            // round up side length to avoid fractional output size
            let sideLength: CGFloat = ceil(sideLength)
    
            // output size has sideLength for both dimensions
            let outputSize: CGSize = CGSizeMake(sideLength, sideLength)
    
            // calculate scale so that smaller dimension fits sideLength
            let scale: CGFloat = max(sideLength / inputSize.width,
                sideLength / inputSize.height)
    
            // scaling the image with this scale results in this output size
            let scaledInputSize: CGSize = CGSizeMake(inputSize.width * scale,
                inputSize.height * scale)
    
            // determine point in center of "canvas"
            let center: CGPoint = CGPointMake(outputSize.width/2.0,
                outputSize.height/2.0)
    
            // calculate drawing rect relative to output Size
            let outputRect: CGRect = CGRectMake(center.x - scaledInputSize.width/2.0,
                center.y - scaledInputSize.height/2.0,
                scaledInputSize.width,
                scaledInputSize.height)
    
            // begin a new bitmap context, scale 0 takes display scale
            UIGraphicsBeginImageContextWithOptions(outputSize, true, 0)
    
            // optional: set the interpolation quality.
            // For this you need to grab the underlying CGContext
            let ctx: CGContextRef = UIGraphicsGetCurrentContext()
            CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh)
    
            // draw the source image into the calculated rect
            sourceImage.drawInRect(outputRect)
    
            // create new image from bitmap context
            let outImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
    
            // clean up
            UIGraphicsEndImageContext()
    
            // pass back new image
            return outImage
    }
    

    用于调用此函数的指令:

    let image: UIImage = UIImage(named: "Image.jpg")!
    let squareImage: UIImage = self.squareCropImageToSideLength(image, sideLength: 320)
    self.myUIImageView.image = squareImage
    

    注意:the initial source code inspiration written in Objective-C has been found on "Cocoanetics" blog.

  • 7

    看起来有点奇怪,但效果很好,并考虑到图像方向:

    var image:UIImage = ...
    
    let img = CIImage(image: image)!.imageByCroppingToRect(rect)
    image = UIImage(CIImage: img, scale: 1, orientation: image.imageOrientation)
    
  • 2
    - (UIImage *)getSubImage:(CGRect) rect{
        CGImageRef subImageRef = CGImageCreateWithImageInRect(self.CGImage, rect);
        CGRect smallBounds = CGRectMake(rect.origin.x, rect.origin.y, CGImageGetWidth(subImageRef), CGImageGetHeight(subImageRef));
    
        UIGraphicsBeginImageContext(smallBounds.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextDrawImage(context, smallBounds, subImageRef);
        UIImage* smallImg = [UIImage imageWithCGImage:subImageRef];
        UIGraphicsEndImageContext();
    
        return smallImg;
    }
    
  • 48
    (UIImage *)squareImageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
        double ratio;
        double delta;
        CGPoint offset;
    
        //make a new square size, that is the resized imaged width
        CGSize sz = CGSizeMake(newSize.width, newSize.width);
    
        //figure out if the picture is landscape or portrait, then
        //calculate scale factor and offset
        if (image.size.width > image.size.height) {
            ratio = newSize.width / image.size.width;
            delta = (ratio*image.size.width - ratio*image.size.height);
            offset = CGPointMake(delta/2, 0);
        } else {
            ratio = newSize.width / image.size.height;
            delta = (ratio*image.size.height - ratio*image.size.width);
            offset = CGPointMake(0, delta/2);
        }
    
        //make the final clipping rect based on the calculated values
        CGRect clipRect = CGRectMake(-offset.x, -offset.y,
                                     (ratio * image.size.width) + delta,
                                     (ratio * image.size.height) + delta);
    
    
        //start a new context, with scale factor 0.0 so retina displays get
        //high quality image
        if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
            UIGraphicsBeginImageContextWithOptions(sz, YES, 0.0);
        } else {
            UIGraphicsBeginImageContext(sz);
        }
        UIRectClip(clipRect);
        [image drawInRect:clipRect];
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return newImage;
    }
    
  • 0

    在iOS9.2SDK上,我使用下面的方法将帧从UIView转换为UIImage

    -(UIImage *)getNeedImageFrom:(UIImage*)image cropRect:(CGRect)rect
    {
      CGSize cropSize = rect.size;
      CGFloat widthScale = image.size.width/self.imageViewOriginal.bounds.size.width;
      CGFloat heightScale = image.size.height/self.imageViewOriginal.bounds.size.height;
      cropSize = CGSizeMake(rect.size.width*widthScale, 
                  rect.size.height*heightScale);
      CGPoint pointCrop = CGPointMake(rect.origin.x*widthScale,
                 rect.origin.y*heightScale);
      rect = CGRectMake(pointCrop.x, pointCrop.y, cropSize.width, cropSize.height);
      CGImageRef subImage = CGImageCreateWithImageInRect(image.CGImage, rect);
      UIImage *croppedImage = [UIImage imageWithCGImage:subImage];
      CGImageRelease(subImage);
    
      return croppedImage;
    }
    
  • 37

    Swift 2.0 Update (CIImage compatibility)

    扩展Maxim's Answer,但如果您的图像基于 CIImage ,则有效 .

    public extension UIImage {
        func imageByCroppingToRect(rect: CGRect) -> UIImage? {
            if let image = CGImageCreateWithImageInRect(self.CGImage, rect) {
                return UIImage(CGImage: image)
            } else if let image = (self.CIImage)?.imageByCroppingToRect(rect) {
                return UIImage(CIImage: image)
            }
           return nil
       }
    }
    
  • 5

    这是基于Noodles答案的更新的Swift 3版本

    func cropping(to rect: CGRect) -> UIImage? {
    
        if let cgCrop = cgImage?.cropping(to: rect) {
            return UIImage(cgImage: cgCrop)
        }
        else if let ciCrop = ciImage?.cropping(to: rect) {
            return UIImage(ciImage: ciCrop)
        }
    
        return nil
    }
    
  • 7

    https://github.com/vvbogdan/BVCropPhoto

    - (UIImage *)croppedImage {
        CGFloat scale = self.sourceImage.size.width / self.scrollView.contentSize.width;
    
        UIImage *finalImage = nil;
        CGRect targetFrame = CGRectMake((self.scrollView.contentInset.left + self.scrollView.contentOffset.x) * scale,
                (self.scrollView.contentInset.top + self.scrollView.contentOffset.y) * scale,
                self.cropSize.width * scale,
                self.cropSize.height * scale);
    
        CGImageRef contextImage = CGImageCreateWithImageInRect([[self imageWithRotation:self.sourceImage] CGImage], targetFrame);
    
        if (contextImage != NULL) {
            finalImage = [UIImage imageWithCGImage:contextImage
                                             scale:self.sourceImage.scale
                                       orientation:UIImageOrientationUp];
    
            CGImageRelease(contextImage);
        }
    
        return finalImage;
    }
    
    
    - (UIImage *)imageWithRotation:(UIImage *)image {
    
    
        if (image.imageOrientation == UIImageOrientationUp) return image;
        CGAffineTransform transform = CGAffineTransformIdentity;
    
        switch (image.imageOrientation) {
            case UIImageOrientationDown:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, image.size.width, image.size.height);
                transform = CGAffineTransformRotate(transform, M_PI);
                break;
    
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
                transform = CGAffineTransformTranslate(transform, image.size.width, 0);
                transform = CGAffineTransformRotate(transform, M_PI_2);
                break;
    
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform, 0, image.size.height);
                transform = CGAffineTransformRotate(transform, -M_PI_2);
                break;
            case UIImageOrientationUp:
            case UIImageOrientationUpMirrored:
                break;
        }
    
        switch (image.imageOrientation) {
            case UIImageOrientationUpMirrored:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, image.size.width, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
    
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform, image.size.height, 0);
                transform = CGAffineTransformScale(transform, -1, 1);
                break;
            case UIImageOrientationUp:
            case UIImageOrientationDown:
            case UIImageOrientationLeft:
            case UIImageOrientationRight:
                break;
        }
    
        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        CGContextRef ctx = CGBitmapContextCreate(NULL, image.size.width, image.size.height,
                CGImageGetBitsPerComponent(image.CGImage), 0,
                CGImageGetColorSpace(image.CGImage),
                CGImageGetBitmapInfo(image.CGImage));
        CGContextConcatCTM(ctx, transform);
        switch (image.imageOrientation) {
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                // Grr...
                CGContextDrawImage(ctx, CGRectMake(0, 0, image.size.height, image.size.width), image.CGImage);
                break;
    
            default:
                CGContextDrawImage(ctx, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
                break;
        }
    
        // And now we just create a new UIImage from the drawing context
        CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
        UIImage *img = [UIImage imageWithCGImage:cgimg];
        CGContextRelease(ctx);
        CGImageRelease(cgimg);
        return img;
    
    }
    
  • 235

    关注@Arne的回答 . 我只是修复类别功能 . 把它放在UIImage的类别中 .

    -(UIImage*)cropImage:(CGRect)rect{
    
        UIGraphicsBeginImageContextWithOptions(rect.size, false, [self scale]);
        [self drawAtPoint:CGPointMake(-rect.origin.x, -rect.origin.y)];
        UIImage* cropped_image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return cropped_image;
    }
    
  • 0

    下面的代码段可能有所帮助 .

    import UIKit
    
    extension UIImage {
        func cropImage(toRect rect: CGRect) -> UIImage? {
            if let imageRef = self.cgImage?.cropping(to: rect) {
                return UIImage(cgImage: imageRef)
            }
            return nil
        }
    }
    

相关问题