使用Core Image缩放图像是裁剪而不是缩放

时间:2018-12-17 05:14:48

标签: swift cocoa core-image swift4.2

我有一个应该使用“核心图像”滤镜缩放图像的功能。它以一个NSImage和一个维数作为参数,并返回缩放后的NSImage。我一直在使用:Processing an Image Using Built-in Filters 作为参考。该代码似乎是在裁剪图像,而不是调整其大小。我发誓我曾经在某一点上工作过,所以我哪里出了问题?

func imageCIScale(_ image: NSImage, dimension: CGFloat) -> NSImage? {
    guard let data = image.tiffRepresentation,
        let scaleFilter = CIFilter(name: "CILanczosScaleTransform"),
        let ciImage = CIImage(data: data)
    else {
        print("Failure! Abject failure! Couldn't even get started")
        return nil
    }

    let scaleFactor = dimension / image.size.height

    scaleFilter.setValue(ciImage, forKey: kCIInputImageKey)
    scaleFilter.setValue(scaleFactor, forKey: kCIInputScaleKey)
    scaleFilter.setValue(1.0, forKey: kCIInputAspectRatioKey)
    let outputImage = scaleFilter.outputImage

    let context = CIContext()
    guard let scaledImage = context.createCGImage(ciImage, from: outputImage!.extent) else {
        print("Failed to create CGImage")
        return nil
    }

    return NSImage(cgImage: scaledImage, size: NSZeroSize)
}

该函数的调用方式如下:

let myScaledNSImage = imageCIScale(myOriginalNSImage, dimension: 32.0)

并应生成32 x 32的图像

1 个答案:

答案 0 :(得分:0)

好吧,一夜安眠后,我发现出了什么问题。创建CG图像时,我使用了错误的图像源

let scaledImage = context.createCGImage(ciImage, from: outputImage!.extent)

应该是

let scaledImage = context.createCGImage(outputImage!, from: outputImage!.extent)

或更像

let context = CIContext()
guard let outputImage = scaleFilter.outputImage,
      let scaledImage = context.createCGImage(outputImage, from: outputImage.extent)
else {
    print("Failed to create CGImage")
    return nil
}

我将保留这个问题,因为一旦纠正,我认为这是在Mac OS上下文中使用Swift 4.2缩放图像的合理示例。

相关问题