裁剪后 UIImage 旋转 90 度

Posted

技术标签:

【中文标题】裁剪后 UIImage 旋转 90 度【英文标题】:UIImage getting rotated 90 degrees after cropping 【发布时间】:2018-03-15 18:53:08 【问题描述】:

我有以下函数来裁剪 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】:

你正在做的是一种非常奇怪的裁剪方式。离开 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。

【讨论】:

这解决了我的定位问题,谢谢!我遇到了另一个问题,我的图像看起来比我想象的要放大,但我很确定那是不相关的,而且我的目的是什么,所以我会调查一下。谢谢 是的,当然一切都取决于您是否首先获得了cropRect。如果您要显示以某种方式缩放的图像,这可能会很棘手。 我用 UIImage 的创建方式编辑了我的问题,这是否能说明为什么我的照片在裁剪后看起来被炸毁了? 将比例设置为 1 可能是问题所在?不确定,实际上取决于您如何得出裁剪矩形。我建议你问一个全新的问题 我可能应该,但我最后要提一下,裁剪矩形是屏幕上另一个视图的框架。把它想象成我在 UIImage 上的视图中移动,当我按下裁剪时,我想在视图下捕获图像

以上是关于裁剪后 UIImage 旋转 90 度的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UIImage 旋转 90 度?

裁剪 UIImage 使其在保存时逆时针旋转 90º

UIImage 在裁剪后被旋转

用相机拍照将asset.fullScreenImage旋转90度?

旋转 UIImageView 数据 -

iOS:图像在保存为 PNG 表示数据后旋转 90 度