CIImage 将调整后的图像大小加倍

Nat*_*olz 0 core-image ios swift

我在操场上有以下代码:

import UIKit

var str = "Hello, playground"

func rescaledImage(_ image: UIImage, with newSize: CGSize) -> UIImage {
    let renderer = UIGraphicsImageRenderer(size: newSize)
    let rescaled = renderer.image { _ in
        image.draw(in: CGRect.init(origin: CGPoint.zero, size: newSize))
    }

    return rescaled
}

let original = UIImage(named: "burn.jpg")!

let resized = rescaledImage(original, with: CGSize(width: 200, height: 200))

let ciImage = CIImage(image: resized)
Run Code Online (Sandbox Code Playgroud)

burn.jpg 是 5000 像素 x 5000 像素的黑白 jpg。

resized图像是适当200个像素200个像素。该ciImage然而,是400个像素×400个像素。事实上,无论我将其大小调整为什么,它ciImage总是加倍。

但是,如果我只是ciImageoriginal

let ciImage = CIImage(image: original)
Run Code Online (Sandbox Code Playgroud)

ciImage 将是 5000 x 5000 像素,而不是加倍。

那么是什么导致了这种翻倍呢?resized图像格式中的某些东西一定会导致这种情况,但我似乎无法将其隔离。

请注意,如果我UIGraphicsBeginImageContextWithOptions改为使用,也会发生这种加倍。

func imageWithImage(image:UIImage, scaledToSize newSize:CGSize) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0);
    image.draw(in: CGRect(origin: CGPoint.zero, size: CGSize(width: newSize.width, height: newSize.height)))
    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return newImage
}
Run Code Online (Sandbox Code Playgroud)

小智 5

如果您检查图像的比例,您会注意到 original.scale 可能是 1,而 resized.scale 可能是 2。

您可以使用 UIGraphicsImageRendererFormat 设置渲染器的比例,看看是否有帮助。

func rescaledImage(_ image: UIImage, with newSize: CGSize) -> UIImage {
    let format = UIGraphicsImageRendererFormat()
    format.scale = 1
    let renderer = UIGraphicsImageRenderer(size: newSize, format: format)
        let rescaled = renderer.image { _ in
        image.draw(in: CGRect.init(origin: CGPoint.zero, size: newSize))
    }

    return rescaled
}
Run Code Online (Sandbox Code Playgroud)