Swift实现图片最大对比度设置:请求完善contrastImage函数
实现Swift图片最大对比度的函数
嘿,我来帮你搞定这个把图片对比度拉满的需求!你现在的函数只是直接返回原图片,咱们得借助Core Image框架来实现对比度调整——毕竟UIImage本身没有内置的对比度调节API。
下面给你两种方案,根据你想要的“最大对比度”效果来选:
方案1:标准最大对比度(Core Image官方支持的上限)
Core Image里的CIColorControls滤镜可以调节对比度,它的contrast参数范围是0到4,4就是官方定义的最大值,能让亮部更亮、暗部更暗,同时保留一些灰度细节:
import UIKit import CoreImage func maxContrastImage(from image: UIImage) -> UIImage? { // 1. 将UIImage转换为CIImage(Core Image的处理对象) guard let ciImage = CIImage(image: image) else { print("无法将UIImage转换为CIImage") return nil } // 2. 创建对比度调节滤镜 guard let filter = CIFilter(name: "CIColorControls") else { print("无法创建CIColorControls滤镜") return nil } // 3. 设置滤镜参数:contrast设为最大值4.0,亮度和饱和度保持默认 filter.setValue(ciImage, forKey: kCIInputImageKey) filter.setValue(4.0, forKey: kCIInputContrastKey) // 0=无对比度,4=最大对比度 // 4. 获取滤镜输出的CIImage guard let outputCIImage = filter.outputImage else { print("滤镜处理失败") return nil } // 5. 将CIImage转换回UIImage let context = CIContext(options: [.useSoftwareRenderer: false]) // 优先用GPU加速 guard let outputCGImage = context.createCGImage(outputCIImage, from: outputCIImage.extent) else { print("无法将CIImage转换为CGImage") return nil } return UIImage(cgImage: outputCGImage) }
方案2:极致黑白对比度(无中间灰度)
如果你想要的“最大对比度”是完全的黑白二值图(没有任何灰色过渡,亮的地方纯白,暗的地方纯黑),可以用CIColorThreshold滤镜,它会根据阈值把图片切成纯黑纯白:
import UIKit import CoreImage func extremeContrastImage(from image: UIImage) -> UIImage? { guard let ciImage = CIImage(image: image) else { print("无法转换为CIImage") return nil } guard let filter = CIFilter(name: "CIColorThreshold") else { print("无法创建CIColorThreshold滤镜") return nil } filter.setValue(ciImage, forKey: kCIInputImageKey) filter.setValue(0.5, forKey: kCIInputThresholdKey) // 阈值设为0.5,你可以根据需求调整 guard let outputCIImage = filter.outputImage else { print("滤镜处理失败") return nil } let context = CIContext(options: [.useSoftwareRenderer: false]) guard let outputCGImage = context.createCGImage(outputCIImage, from: outputCIImage.extent) else { print("无法转换为CGImage") return nil } return UIImage(cgImage: outputCGImage) }
使用示例
你可以这样调用函数:
if let originalImage = UIImage(named: "yourImageName") { if let highContrastImage = maxContrastImage(from: originalImage) { // 处理调整后的图片,比如显示在UIImageView里 imageView.image = highContrastImage } }
注意点
- 别忘了导入
CoreImage框架,否则滤镜相关的API会报错。 - CIContext可以全局创建一个单例,不用每次调用函数都新建,这样能提升性能。
- 如果你的图片是超大图,建议用软件渲染(把
.useSoftwareRenderer设为true)避免GPU内存不足,但速度会慢一些。
内容的提问来源于stack exchange,提问作者JustAnotherGuy
相关产品推荐
相关产品推荐

