如何在Swift中使用比例因子缩放图像

时间:2019-04-23 05:03:24

标签: swift image

我得到了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 但是第一种方法是:新图像的大小为(3840x2160),第二种图像的大小为(960x540)

我真的很困惑。谁能解释我为什么会这样 将来在使用新功能时,如果使用参数scale,我怎么知道缩放时使图像变小,反之亦然

1 个答案:

答案 0 :(得分: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
}