【问题标题】:Resize CIImage to an exact size将 CIImage 调整为精确大小
【发布时间】:2020-08-18 17:38:21
【问题描述】:

我正在寻找一种将CIImage 调整为精确大小的方法,因为我正在使用混合CIFilter 并且需要两个混合CIImages 的大小相同。我需要使用CIFilter 来调整图像大小,因为它在内存方面对我来说更便宜,而且我不能使用 Core Graphics 等。

我知道有一个CILanczosScaleTransform 过滤器可用,但它不允许调整大小以达到精确的大小,只能缩小或放大。

有没有办法只使用Core Image 使CIImage 具有精确的大小?

【问题讨论】:

  • 您想到了哪些调整大小的行为?如果纵横比不匹配,应该裁剪还是拉伸?
  • 它可能会被拉伸。图片的主要优先级是按照要求的确切尺寸。

标签: swift scale core-image cifilter ciimage


【解决方案1】:

CILanczosScaleTransform 有两个参数:

  • scale:图像上使用的比例因子
  • aspectRatio:用于图像的附加水平缩放因子

使用这两个参数,可以达到一个目标图像尺寸。计算垂直尺寸的缩放因子以获得所需的高度,然后计算应用于水平尺寸的缩放结果。这可能与目标宽度不匹配,因此请计算适用于缩放宽度的纵横比以将其校正为所需的目标宽度。

import CoreImage

let context = CIContext()
let imageURL = URL(fileURLWithPath: "sample.jpg")
let sourceImage = CIImage(contentsOf: imageURL, options: nil)
let resizeFilter = CIFilter(name:"CILanczosScaleTransform")!

// Desired output size
let targetSize = NSSize(width:190, height:230)

// Compute scale and corrective aspect ratio
let scale = targetSize.height / (sourceImage?.extent.height)!
let aspectRatio = targetSize.width/((sourceImage?.extent.width)! * scale)

// Apply resizing
resizeFilter.setValue(sourceImage, forKey: kCIInputImageKey)
resizeFilter.setValue(scale, forKey: kCIInputScaleKey)
resizeFilter.setValue(aspectRatio, forKey: kCIInputAspectRatioKey)
let outputImage = resizeFilter.outputImage

我的示例图片尺寸为(w 2,048 h 1,536)。计算出的比例因子为 0.1497395833333333,纵横比为 0.6195652173913043,目标输出尺寸为 (w 190 h 230)

【讨论】:

  • 谢谢!这是一种魅力。计算部分正是我想要的 :)
  • 我得到了未解析的标识符NSSize,所以我使用了 CGSize,但调整大小通常会偏离 1。也就是说,我可能会得到 189 x 230,而不是总是得到 190x230,等等。
  • @sickerin NSSizeCGSize 的类型别名,所以它不应该有任何区别。源图像大小是多少?也许这是一个舍入错误。
  • @gavinb 实际上我遇到了同样的问题,最终结果偏离了 1 个像素。我想知道这是否可以以某种方式解决?源图像大小始终不同。
  • @SmartTree 源和目标图像大小是多少?
【解决方案2】:

如果你只想扩展画布并保留原始图像,请使用此

ciimage.clampedToExtent().cropped(to: CGRect(x: 0, y: 0, width: 100, height: 100))

或者你可能想要缩放整个图像,然后使用这个

ciimage.transformed(by: CGAffineTransform(scaleX: 10, y: 10))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2023-04-01
    相关资源
    最近更新 更多