将 CIImage 调整为精确大小
Resize CIImage to an exact size
我正在寻找一种方法来将 CIImage
调整为精确大小,因为我正在使用混合 CIFilter
并且需要两个混合 CIImage
大小相同。我需要使用 CIFilter
来调整图像大小,因为它在内存方面对我来说更便宜,而且我不能使用 Core Graphics 等
我知道有一个 CILanczosScaleTransform
过滤器可用,但它不允许调整为精确大小,只能按比例缩小或按比例放大。
有没有办法让 CIImage
成为精确的大小,只使用 Core Image
?
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)
.
如果您只想扩展 canvas 并保留原始图像,请使用此
ciimage.clampedToExtent().cropped(to: CGRect(x: 0, y: 0, width: 100, height: 100))
或者您可能想要缩放整个图像,然后使用这个
ciimage.transformed(by: CGAffineTransform(scaleX: 10, y: 10))
我正在寻找一种方法来将 CIImage
调整为精确大小,因为我正在使用混合 CIFilter
并且需要两个混合 CIImage
大小相同。我需要使用 CIFilter
来调整图像大小,因为它在内存方面对我来说更便宜,而且我不能使用 Core Graphics 等
我知道有一个 CILanczosScaleTransform
过滤器可用,但它不允许调整为精确大小,只能按比例缩小或按比例放大。
有没有办法让 CIImage
成为精确的大小,只使用 Core Image
?
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)
.
如果您只想扩展 canvas 并保留原始图像,请使用此
ciimage.clampedToExtent().cropped(to: CGRect(x: 0, y: 0, width: 100, height: 100))
或者您可能想要缩放整个图像,然后使用这个
ciimage.transformed(by: CGAffineTransform(scaleX: 10, y: 10))