Jor*_*orn 6 macos ios ciimage swift
我正在尝试通过平均其他几个图像来创建图像。为了实现这一点,我首先将每个图像变暗一个与我平均的图像数量相等的因子:
func darkenImage(by multiplier: CGFloat) -> CIImage? {
let divImage = CIImage(color: CIColor(red: multiplier, green: multiplier, blue: multiplier))
let divImageResized = divImage.cropped(to: self.extent) //Set multiplier image to same size as image to be darkened
if let divFilter = CIFilter(name: "CIMultiplyBlendMode", parameters: ["inputImage":self, "inputBackgroundImage":divImageResized]) {
return divFilter.outputImage
}
print("Failed to darken image")
return nil
}
Run Code Online (Sandbox Code Playgroud)
在此之后,我将每个变暗的图像添加在一起(将图像 1 和 2 添加在一起,然后将结果与图像 3 等一起添加):
func blend(with image: CIImage, blendMode: BlendMode) -> CIImage? {
if let filter = CIFilter(name: blendMode.format) { //blendMode.format is CIAdditionCompositing
filter.setDefaults()
filter.setValue(self, forKey: "inputImage")
filter.setValue(image, forKey: "inputBackgroundImage")
let resultImage = filter.outputImage
return resultImage
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
这段代码执行并生成一个新图像,但是我平均在一起的图像越多,阴影就越暗。高光与每个单独的图像保持大致相同的亮度,但较暗的部分只会变得越来越暗。有谁知道可能有什么问题?
为了减少潜在问题的数量,我还尝试在 Lightroom 中预先使图像变暗并仅应用CIAdditionCompositing过滤器。这给出了相同的结果,这让我认为CIAdditionCompositing可能不仅仅是将像素相加,而是使用了一些略有不同的算法,但我还没有找到任何关于此的文档。我还尝试更改变暗乘数以查看是否计算错误,但是如果我将图像变暗较少,则再次将图像添加在一起时,高光会过度曝光。
这可能来得有点晚,但有些。
我怀疑问题在于色域不是线性的,就像肯·托马斯提到的那样。不幸的是,将所有图像转换为与过滤器呈线性关系"CISRGBToneCurveToLinear",并且在所有图像堆叠之后将它们转换回来并"CILinearToSRGBToneCurve"不能解决问题。
每次添加两张图像后使用曝光调整将曝光减半确实解决了问题。要将曝光减半,您需要将光圈值减小 1 级,因此曝光值 (EV) 需要为 -1。
此外,我添加了中间图像,只是因为当过滤器堆栈太大时,我有时会在旧手机上遇到麻烦CIImage。
if let evFilter = CIFilter(name: "CIExposureAdjust", parameters: ["inputImage":self, "inputEV":NSNumber(-1)]) {
return evFilter.outputImage?.insertingIntermediate()
}
Run Code Online (Sandbox Code Playgroud)
PS:请注意,为了创建正确的结果,图像需要相互添加并减半曝光,以便每个图像与结果图像具有相同的权重。只需添加下一张图像并随后减少曝光,最后添加的图像将始终占整体结果 50% 的权重。
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |