214

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

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

理论 1)我通过绘制到我的目标尺寸的屏幕外图像上下文来实现裁剪。由于我想要图像的中心部分,因此我将CGRect传递给的参数设置为drawInRect大于图像上下文范围的参数。我希望这是 Kosher,但我是不是试图画出我不应该接触的其他记忆?

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

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

4

25 回答 25

237

2014-05-28 更新:我在 iOS 3 左右是热门新事物时写了这个,我敢肯定现在有更好的方法可以做到这一点,可能是内置的。正如许多人提到的,这种方法没有考虑轮换;阅读一些额外的答案并传播一些赞成的爱,以使对这个问题的回答对每个人都有帮助。

原始回复:

我将在别处复制/粘贴我对同一问题的回答:

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

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

CGImageRef imageRef = CGImageCreateWithImageInRect([largeImage CGImage], cropRect);
// or use the UIImage wherever you like
[UIImageView setImage:[UIImage imageWithCGImage:imageRef]]; 
CGImageRelease(imageRef);
于 2009-04-03T04:31:12.997 回答
91

要在保持相同比例和方向的情况下裁剪视网膜图像,请在 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;
}
于 2011-12-09T10:10:16.260 回答
66

您可以创建一个 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];
于 2011-10-09T15:03:54.563 回答
59

斯威夫特 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

在此处输入图像描述

在此桥接功能的帮助下CGRectMake-> CGRect此答案由 回答@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)
    )
}

输出:

在此处输入图像描述

于 2014-09-13T15:05:01.397 回答
49

这是我的 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;
}
于 2013-02-05T16:27:46.740 回答
44

注意:所有这些答案都假设一个CGImage支持的图像对象。

image.CGImageUIImage如果由 a 支持,则可以返回 nil,CIImage如果您使用 a 创建此图像就是这种情况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;
}
于 2013-09-03T22:44:54.290 回答
36

这里没有一个答案能 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;
}
于 2014-08-13T18:32:52.133 回答
23

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

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
    }
}
于 2018-01-05T09:32:16.407 回答
10
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);

我看到的大多数响应只处理 (x, y) 的 (0, 0) 位置。好的,这是一种情况,但我希望我的裁剪操作能够居中。我花了一段时间才弄清楚 WTF 评论后面的那一行。

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

  1. 原始图像的高度高于其宽度(哇,到目前为止并不奇怪!)
  2. CGImageCreateWithImageInRect 方法在它自己的世界中想象的图像不是真正的肖像而是风景(这也是为什么如果你不使用 imageWithCGImage 构造函数中的方向参数,它将显示为 180 旋转)。
  3. 所以,你应该想象它是一个风景, (0, 0) 位置是图像的右上角。

希望这是有道理的!如果没有,请尝试不同的值,您会发现在为您的cropRect 选择正确的 x、y、宽度和高度时,逻辑是相反的。

于 2011-03-29T03:30:57.130 回答
9

迅捷3

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)
    }
}
于 2016-11-04T11:54:25.813 回答
7

快速扩展

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
    }
}
于 2015-05-22T18:47:57.307 回答
4

在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

注意:最初用 Objective-C 编写的源代码灵感可以在“Cocoanetics”博客上找到。

于 2015-03-27T06:07:28.800 回答
3

下面的代码片段可能会有所帮助。

import UIKit

extension UIImage {
    func cropImage(toRect rect: CGRect) -> UIImage? {
        if let imageRef = self.cgImage?.cropping(to: rect) {
            return UIImage(cgImage: imageRef)
        }
        return nil
    }
}
于 2018-10-31T09:07:36.210 回答
2

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

var image:UIImage = ...

let img = CIImage(image: image)!.imageByCroppingToRect(rect)
image = UIImage(CIImage: img, scale: 1, orientation: image.imageOrientation)
于 2015-09-25T17:06:52.980 回答
1
- (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;
}
于 2012-04-17T05:41:56.813 回答
1
 (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;
}
于 2015-01-22T09:28:22.360 回答
1

Swift 2.0 更新(CIImage兼容性)

扩展Maxim 的答案,但如果您的图像是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
   }
}
于 2016-06-27T18:26:33.943 回答
1

关注@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;
}
于 2017-06-28T11:53:01.387 回答
1

斯威夫特 5:

extension UIImage {
    func cropped(rect: CGRect) -> UIImage? {
        guard let cgImage = cgImage else { return nil }

        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
        let context = UIGraphicsGetCurrentContext()

        context?.translateBy(x: 0.0, y: self.size.height)
        context?.scaleBy(x: 1.0, y: -1.0)
        context?.draw(cgImage, in: CGRect(x: rect.minX, y: rect.minY, width: self.size.width, height: self.size.height), byTiling: false)


        let croppedImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return croppedImage
    }
}
于 2019-06-13T11:16:56.927 回答
1

这是基于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
}
于 2017-04-24T03:36:23.943 回答
1

在 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;
}
于 2016-01-29T02:14:54.343 回答
0

我对其他解决方案不满意,因为它们要么绘制了几次(使用了不必要的功率),要么有方向问题。这是我从 UIImage * 图像中用于缩放正方形croppedImage 的内容。

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();
于 2014-01-10T10:28:47.477 回答
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;

}

于 2016-01-29T13:01:10.813 回答
0

看看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) * 比例,
            (self.scrollView.contentInset.top + self.scrollView.contentOffset.y) * 比例,
            self.cropSize.width * 比例,
            self.cropSize.height * 比例);

    CGImageRef contextImage = CGImageCreateWithImageInRect([[self imageWithRotation:self.sourceImage] CGImage], targetFrame);

    如果(上下文图像!= NULL){
        finalImage = [UIImage imageWithCGImage:contextImage
                                         规模:self.sourceImage.scale
                                   方向:UIImageOrientationUp];

        CGImageRelease(contextImage);
    }

    返回最终图像;
}


- (UIImage *)imageWithRotation:(UIImage *)image {


    if (image.imageOrientation == UIImageOrientationUp) 返回图片;
    CGAffineTransform 变换 = CGAffineTransformIdentity;

    开关(image.imageOrientation){
        案例 UIImageOrientationDown:
        案例 UIImageOrientationDownMirrored:
            变换 = CGAffineTransformTranslate(变换,image.size.width,image.size.height);
            变换 = CGAffineTransformRotate(变换,M_PI);
            休息;

        案例 UIImageOrientationLeft:
        案例 UIImageOrientationLeftMirrored:
            变换 = CGAffineTransformTranslate(变换, image.size.width, 0);
            变换 = CGAffineTransformRotate(变换,M_PI_2);
            休息;

        案例 UIImageOrientationRight:
        案例 UIImageOrientationRightMirrored:
            变换 = CGAffineTransformTranslate(变换, 0, image.size.height);
            变换 = CGAffineTransformRotate(变换,-M_PI_2);
            休息;
        案例 UIImageOrientationUp:
        案例 UIImageOrientationUpMirrored:
            休息;
    }

    开关(image.imageOrientation){
        案例 UIImageOrientationUpMirrored:
        案例 UIImageOrientationDownMirrored:
            变换 = CGAffineTransformTranslate(变换, image.size.width, 0);
            变换 = CGAffineTransformScale(变换, -1, 1);
            休息;

        案例 UIImageOrientationLeftMirrored:
        案例 UIImageOrientationRightMirrored:
            变换 = CGAffineTransformTranslate(变换, image.size.height, 0);
            变换 = CGAffineTransformScale(变换, -1, 1);
            休息;
        案例 UIImageOrientationUp:
        案例 UIImageOrientationDown:
        案例 UIImageOrientationLeft:
        案例 UIImageOrientationRight:
            休息;
    }

    // 现在我们将底层的 CGImage 绘制到一个新的上下文中,应用变换
    // 上面计算。
    CGContextRef ctx = CGBitmapContextCreate(NULL, image.size.width, image.size.height,
            CGImageGetBitsPerComponent(image.CGImage), 0,
            CGImageGetColorSpace(image.CGImage),
            CGImageGetBitmapInfo(image.CGImage));
    CGContextConcatCTM(ctx, 变换);
    开关(image.imageOrientation){
        案例 UIImageOrientationLeft:
        案例 UIImageOrientationLeftMirrored:
        案例 UIImageOrientationRight:
        案例 UIImageOrientationRightMirrored:
            // 嘎嘎...
            CGContextDrawImage(ctx, CGRectMake(0, 0, image.size.height, image.size.width), image.CGImage);
            休息;

        默认:
            CGContextDrawImage(ctx, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
            休息;
    }

    // 现在我们只是从绘图上下文中创建一个新的 UIImage
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
    UIImage *img = [UIImage imageWithCGImage:cgimg];
    CGContextRelease(ctx);
    CGImageRelease(cgimg);
    返回图片;

}
于 2016-10-28T07:33:59.367 回答
0

斯威夫特 5.0 更新

public extension UIImage {
    func cropped(rect: CGRect) -> UIImage? {
        if let image = self.cgImage!.cropping(to: rect) {
            return UIImage(cgImage: image)
        } else if let image = (self.ciImage)?.cropped(to: rect) {
            return UIImage(ciImage: image)
        }
       return nil
   }
}
于 2021-12-08T02:50:24.573 回答