【问题标题】:Using CILanczosScaleTransform Core Image Filter to resize an image使用 CILanczosScaleTransform Core Image Filter 调整图像大小
【发布时间】:2015-03-12 20:20:20
【问题描述】:

我正在尝试使用CILanczosScaleTransform Core Image Filter 来调整图像大小,但我遇到了问题。这是我的代码:

var imageView: UIImageView = UIImageView()
var image: UIImage?
imageView.frame = CGFrameMake(10,10,200,300)
dispatch_async(dispatch_get_main_queue(), {
    let nsurl = NSURL(string:"http://...")
    var err: NSError?
    var getImageData = NSData(contentsOfURL: nsurl!, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)
    if let imageData = getImageData {
        if let receivedImage = UIImage(data: imageData){
            image = receivedImage
/*
  so far all this code works fine, if I set imageView.image = image 
  the image displays with no problems...

  ...the problems are in this bit of code:
                                                    */
            let context = CIContext(options:nil)
            var ciimg = CIImage(image: image)
            var filter = CIFilter(name: "CILanczosScaleTransform")
            filter.setValue(image, forKey: kCIInputImageKey)
            filter.setValue(0.667, forKey: kCIInputScaleKey)
            let result: CIImage = filter.outputImage

            let extent = result.extent() // <-- specifically this line

            let newImage: UIImage? = UIImage(CIImage: result)
            imageView.image = newImage
        }
    }
})

当执行到达let extent = result.extent() 行时,我收到以下运行时错误:

-[UIImage extent]: unrecognized selector sent to instance 0x7a457790
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImage extent]: unrecognized selector sent to instance 0x7a457790'

我将我在 Apple's Core Image Programming Guide 上找到的代码从 Objective C 翻译到了 Swift,我觉得我可能翻译错了。

谁能把我说的对吗?

【问题讨论】:

  • 除了CGFrameMake,代码对我来说都很好,但这无关紧要。

标签: ios swift core-image


【解决方案1】:

好吧,这是我的错误。这一行:filter.setValue(image, forKey: kCIInputImageKey) 正在使用 image 中的 UIImage 并在过滤器中使用它,而应该使用 ciimg 中的 CIImage

所以完整的代码应该是:

var imageView: UIImageView = UIImageView()
var image: UIImage?
imageView.frame = CGFrameMake(10,10,200,300)
dispatch_async(dispatch_get_main_queue(), {
    let nsurl = NSURL(string:"http://...")
    var err: NSError?
    var getImageData = NSData(contentsOfURL: nsurl!, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)
    if let imageData = getImageData {
        if let receivedImage = UIImage(data: imageData){
            image = receivedImage
            let context = CIContext(options:nil)
            var ciimg = CIImage(image: image)
            var filter = CIFilter(name: "CILanczosScaleTransform")
            filter.setValue(ciimg, forKey: kCIInputImageKey)
            filter.setValue(0.667, forKey: kCIInputScaleKey)
            let result: CIImage = filter.outputImage
            let extent = result.extent()
            let newImage: UIImage? = UIImage(CIImage: result)
            imageView.image = newImage
        }
    }
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多