我有两张不同尺寸的图像,我想使用
CIFilter
将它们合成在一起。 ImageA
尺寸为2400x1800
。 ImageB
尺寸为 1200x900
。
由于两幅图像尺寸不同,当图像合成在一起时,ImageB 位于左下角,尺寸为
ImageA
的四分之一。
这确实有道理,但这不是我的意图。我希望调整
ImageB
的大小以适应与 ImageA
相同的完整尺寸。
我使用扩展来调整ImageB的大小,但性能很慢,而且似乎没有任何效果。
问题
如何有效地调整 ImageB 的大小以适应与 ImageA 相同的完整尺寸,保持两个图像居中对齐并保持纵横比?
CIFilter
是否有内置选项可以在应用滤镜之前调整图像大小?
注意:作为一个侧面的想法,我考虑了一种非常规的方法,使用大小为
UIImageView
的 ImageA
,加载到 ImageB
,然后拍摄快照。这似乎可以保证正确的尺寸和外观以及良好的性能。
代码
// Resize image extension
extension UIImage {
func resized(to size: CGSize) -> UIImage {
return UIGraphicsImageRenderer(size: size).image { _ in
draw(in: CGRect(origin: .zero, size: size))
}
}
}
// Resize image usage
let ImageA = UIImage()
let ImageB = UIImage()
let resizedImage = ImageB.resized(to: CGSize(width: ImageA.size.width, height: ImageA.size.height))
ImageB = resizedImage
// Composite filter
let addCIFilter = CIFilter(name: "CIColorDodgeBlendMode")!
addCIFilter.setValue(CIImage(image: ImageA), forKey: kCIInputImageKey)
addCIFilter.setValue(CIImage(image: ImageB), forKey: kCIInputBackgroundImageKey)
let outputImage = addCIFilter.outputImage
找到方法了。可以直接调整或缩放输入图像,从而提供良好的性能。
示例
addCIFilter.setValue(CIImage(image: ImageB.resized(to: CGSize(width: 2400, height: 1800))), forKey: kCIInputBackgroundImageKey)
参考
.resized(to:)
这会调整图像大小以适合给定尺寸,同时保持其纵横比。
let myImage1 = UIImage()
myImage1.resized(to: CGSize(width: 100, height: 100))
.scaled(to:)
这会缩放图像以适应给定尺寸,同时保持其纵横比。
let myImage1 = UIImage()
myImage1.scaled(to: CGSize(width: 100, height: 100))
信用
感谢 Objective-C
CGAffineTransform
的提示:https://stackoverflow.com/a/19778622