0

我得到了一张 1920x1080 像素的大图像。我正在尝试用 2 种不同的方式缩放图像:

第一:使用CIFilter

    func resize(image: UIImage, scale: Float, aspect: Float = 1) -> UIImage? {
    return autoreleasepool(invoking: {
        [weak self] () -> UIImage? in

        var filter: CIFilter! = CIFilter(name: "CILanczosScaleTransform")!
        filter.setValue(CIImage(image: image), forKey: kCIInputImageKey)
        filter.setValue(NSNumber(value: scale as Float), forKey: kCIInputScaleKey)
        filter.setValue(NSNumber(value: aspect as Float), forKey: kCIInputAspectRatioKey)

        var result: UIImage?
        var cgImage: CGImage? = nil
        if let outputImage = filter.outputImage {
            cgImage = self?.ctx?.createCGImage(outputImage, from: outputImage.extent)
        }
        if let cgImg = cgImage {
            result = self?.convertUIImage(fromCGImage: cgImg)
        }
        if #available(iOS 10.0, *) {
            self?.ctx?.clearCaches()
        }
        cgImage = nil
        filter.setValue(nil, forKey: kCIInputImageKey)
        filter.setValue(nil, forKey: kCIInputScaleKey)
        filter.setValue(nil, forKey: kCIInputAspectRatioKey)
        filter.setDefaults()
        filter = nil
        return result
    })
}

二:使用 UIImage()

func scaleImage(scale: CGFloat) -> UIImage? {
        if let cgImage = self.cgImage {
            return UIImage(cgImage: cgImage, scale: scale, orientation: imageOrientation)
        }
        return nil
    }

但我意识到两种方法中的比例因子产生了相互矛盾的结果。例如,我将比例设置为 2 但在第一种方法中:新图像是 size (3840x2160),第二个是(960x540).

我真的很困惑。谁能解释我为什么会发生这种情况在将来使用新功能时有参数scale我怎么知道什么时候缩放使我的图像更小,反之亦然

4

1 回答 1

0

默认情况下,图像具有比例,它可以是任何值。在开始时,您的图像比例可以大于 2,这就是为什么您的图像接收的第二种方式更小。尝试这个。

func scaleImage(image: UIImage, scale: CGFloat) -> UIImage? {
    let size = CGSize(width: image.size.width * scale, height: image.size.height * scale)
    let drawRect = CGRect(origin: .zero, size: size)

    UIGraphicsBeginImageContextWithOptions(size, false, 0)

    image.draw(in: drawRect)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()

    return newImage
}
于 2019-04-23T06:24:04.063 回答