裁剪后UIImage旋转90度

时间:2018-03-15 18:53:08

标签: swift uiimage

我有以下函数来裁剪UIImage的一部分并返回裁剪的UIImage。但是,使用此裁剪的UIImage时,它已旋转90度。我的图像通常处于“纵向模式”,我想你可以说,我试图在裁剪后保持这种状态。

我知道还有其他帖子有这个问题,但我试图实施解决方案,没有一个对我有用。

  private func cropImage(image: UIImage, cropRect: CGRect) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(cropRect.size, false, 0);
        let context = UIGraphicsGetCurrentContext();

        context?.translateBy(x: 0.0, y: image.size.height);
        context?.scaleBy(x: 1.0, y: -1.0);
        context?.draw(image.cgImage!, in: CGRect(x:0, y:0, width:image.size.width, height:image.size.height), byTiling: false);
        context?.clip(to: [cropRect]);

        let croppedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        return croppedImage!;
    }

由以下内容创建的原始UIImage:

let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer!)
let dataProvider = CGDataProvider(data: imageData as CFData)
let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.defaultIntent)

let image = UIImage(cgImage: cgImageRef!, scale: 1.0, orientation: self.getImageOrientation(forCamera: self.currentCamera))

1 个答案:

答案 0 :(得分:1)

你正在做的是一种非常奇怪的裁剪方式。从UIImage世界走出进入CGImage世界可以让你遇到各种各样的困难(正如你所发现的那样);丢失缩放和方向信息,图像最终可能会垂直翻转。正常的方式更像是这样:

UIGraphicsBeginImageContextWithOptions(cropRect.size, false, 0)
image.draw(at:CGPoint(x:-cropRect.origin.x, y:-cropRect.origin.y))
let croppedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

另请注意,从iOS 10开始,整个UIGraphicsBeginImageContextWithOptions舞蹈已经过时,因为您可以使用UIGraphicsImageRenderer。