如何使用CIFilter合成两张不同尺寸的图像

问题描述 投票:0回答:1

我有两张不同尺寸的图像,我想使用

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
ios swift optimization uiimage cifilter
1个回答
0
投票

找到方法了。可以直接调整或缩放输入图像,从而提供良好的性能。

示例

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

© www.soinside.com 2019 - 2024. All rights reserved.