从 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
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...