gpt4 book ai didi

ios - 用 UIGraphicsImageRenderer 的 jpegData 替换 UIImageJPEGRepresentation

转载 作者:可可西里 更新时间:2023-11-01 03:56:35 26 4
gpt4 key购买 nike

我正在努力在 iOS 10 中添加对宽幅彩色照片的支持。当用户从相机拍摄照片时,我需要使用支持新色彩空间的新 API 来保存照片数据 - UIGraphicsImageRenderer jpegData 而不是 UIImageJPEGRepresentation

我在图像方向方面遇到了一些麻烦。在我的 iPad 上拍摄纵向照片时,图像绘制不正确。请参阅以下评论:

旧 API:

let image = info[UIImagePickerControllerOriginalImage] as! UIImage
let imageData = UIImageJPEGRepresentation(image, 1)

新 API:

let image = info[UIImagePickerControllerOriginalImage] as! UIImage
let cgImage = image.cgImage!
let ciImage = CIImage(cgImage: cgImage)

let format = UIGraphicsImageRendererFormat()
format.scale = 1
format.prefersExtendedRange = true

let renderer = UIGraphicsImageRenderer(bounds: ciImage.extent, format: format)
let imageData = renderer.jpegData(withCompressionQuality: 1, actions: { context in
context.cgContext.draw(cgImage, in: ciImage.extent) //draws flipped horizontally
//image.draw(at: .zero) //draws rotated 90 degrees leaving black at bottom
//image.draw(in: ciImage.extent) //draws rotated 90 degrees stretching and compressing the image to fill the rect
})

UIImageJPEGRepresentation 替换为 UIGraphicsImageRendererjpegData 的正确方法是什么?

最佳答案

UIImage 可以根据相机旋转具有不同的方向。您可以根据该方向动态解析需要应用于图像的转换,如下所示:

let renderer = UIGraphicsImageRenderer(size: image.size, format: format)
let imageData = renderer.jpegData(withCompressionQuality: 1, actions: { context in
var workSize = image.size;
workSize.width = floor(workSize.width / image.scale)
workSize.height = floor(workSize.height / image.scale)
// No-op if the orientation is already correct
// if image.imageOrientation == .up { draw image }

// We need to calculate the proper transformation to make the image upright.
// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.

var transform = CGAffineTransform.identity

switch image.imageOrientation
{
case .down, .downMirrored:
transform = transform.translatedBy(x: workSize.width, y: workSize.height)
transform = transform.rotated(by: CGFloat(Double.pi))
break

case .left, .leftMirrored:
transform = transform.translatedBy(x: workSize.width, y: 0.0)
transform = transform.rotated(by: CGFloat(Double.pi / 2.0))
break

case .right, .rightMirrored:
transform = transform.translatedBy(x: 0.0, y: workSize.height)
transform = transform.rotated(by: CGFloat(-Double.pi / 2.0))
break

case .up, .upMirrored:
break
}

switch image.imageOrientation
{
case .upMirrored, .downMirrored:
transform = transform.translatedBy(x: workSize.width, y: 0.0)
transform = transform.scaledBy(x: -1.0, y: 1.0)
break

case .leftMirrored, .rightMirrored:
transform = transform.translatedBy(x: workSize.height, y: 0.0);
transform = transform.scaledBy(x: -1.0, y: 1.0);
break

case .up, .down, .left, .right:
break
}

// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.

let ctx = context.cgContext

ctx.concatenate(transform)

switch image.imageOrientation {
case .left, .leftMirrored, .right, .rightMirrored:
ctx.draw(image.cgImage!, in: CGRect(x: 0.0, y:0.0, width: workSize.height, height: workSize.width))
break;

default:
ctx.draw(image.cgImage!, in: CGRect(origin: .zero, size: workSize))
break;
}
})

答案基于 UIImage+fixOrientation

关于ios - 用 UIGraphicsImageRenderer 的 jpegData 替换 UIImageJPEGRepresentation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com