如何解决从 UIImage 创建的 JPG 从 CIImage 创建的 3x 太大
我有一堆 CIFilter
最终将大图像(来自 iPhone 相机)缩放和裁剪为 1080x1920 CIImage
。
然后我想将图像另存为 JPG:
var outputFilter: CIFilter?
...
if let ciImage = outputFilter?.outputImage {
let outputImage = UIImage(ciImage: ciImage)
let data = outputImage?.jpegData(compressionQuality: 0.8)
...
}
ciImage.extent
是 1080x1920,outputImage.size
也是 1080x1920,outputImage.scale
是 1.0。
保存到磁盘的图像是原来的 3 倍:3240x5760。
我错过了什么?
解决方法
这将根据您的屏幕比例返回一个图像。如果您检查您的屏幕比例,它将导致 3X。您需要的是使用屏幕比例初始化您的 uiimage:
let outputImage = UIImage(ciImage: ciImage,scale: UIScreen.main.scale,orientation: .up)
要渲染图像,您可以使用 UIGraphicsImageRenderer:
extension CIImage {
var rendered: UIImage {
let cgImage = CIContext(options: nil).createCGImage(self,from: extent)!
let size = extent.size
let format = UIGraphicsImageRendererFormat.default()
format.opaque = false
return UIGraphicsImageRenderer(size: size,format: format).image { ctx in
var transform = CGAffineTransform(scaleX: 1,y: -1)
transform = transform.translatedBy(x: 0,y: -size.height)
ctx.cgContext.concatenate(transform)
ctx.cgContext.draw(cgImage,in: CGRect(origin: .zero,size: size))
}
}
}
,
我需要执行以下操作才能获得正确的尺寸并避免不良渲染(如 comments of Leo Dabus' answer 中所述)。
private func renderImage(ciImage: CIImage) -> UIImage?
{
var outputImage: UIImage?
UIGraphicsBeginImageContext(CGSize(width: 1080,height: 1920))
if let context = UIGraphicsGetCurrentContext()
{
context.interpolationQuality = .high
context.setShouldAntialias(true)
let inputImage = UIImage(ciImage: ciImage)
inputImage.draw(in: CGRect(x: 0,y: 0,width: 1080,height: 1920))
outputImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
return outputImage
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。