如何使用 CIFilter 在 Swift 中将 UIImage 转换为灰度?
How can I convert an UIImage to grayscale in Swift using CIFilter?
我正在为 iOS 应用程序构建一个扫描仪组件,到目前为止,我已经裁剪了结果图像并以正确的视角显示。
现在我需要将彩色图像变成黑白 "Scanned" 文档。
我尝试使用 - "CIPhotoEffectNoir" 但它的灰度等级高于全黑和白色。我希望获得 100% 黑色和 100% 白色的全对比度图像。
我怎样才能做到这一点?
谢谢
您可以使用 CIColorControls 并设置 Contrast Key kCIInputContrastKey
来增加 black/white 对比度,如下所示:
Xcode 9 • Swift 4
extension String {
static let colorControls = "CIColorControls"
}
extension UIImage {
var coreImage: CIImage? { return CIImage(image: self) }
}
extension CIImage {
var uiImage: UIImage? { return UIImage(ciImage: self) }
func applying(contrast value: NSNumber) -> CIImage? {
return applyingFilter(.colorControls, parameters: [kCIInputContrastKey: value])
}
func renderedImage() -> UIImage? {
guard let image = uiImage else { return nil }
return UIGraphicsImageRenderer(size: image.size,
format: image.imageRendererFormat).image { _ in
image.draw(in: CGRect(origin: .zero, size: image.size))
}
}
}
let url = URL(string: "https://i.stack.imgur.com/Xs4RX.jpg")!
do {
if let coreImage = UIImage(data: try Data(contentsOf: url))?.coreImage,
let increasedContrast = coreImage.applying(contrast: 1.5) {
imageView.image = increasedContrast.uiImage
// if you need to convert your image to data (JPEG/PNG) you would need to render the ciimage using renderedImage method on CIImage
}
} catch {
print(error)
}
要从颜色转换为灰度,您可以将饱和度键 kCIInputSaturationKey
设置为零:
extension CIImage {
func applying(saturation value: NSNumber) -> CIImage? {
return applyingFilter(.colorControls, parameters: [kCIInputSaturationKey: value])
}
var grayscale: CIImage? { return applying(saturation: 0) }
}
let url = URL(string: "https://i.stack.imgur.com/Xs4RX.jpg")!
do {
if let coreImage = UIImage(data: try Data(contentsOf: url))?.coreImage,
let grayscale = coreImage.grayscale {
// use grayscale image here
imageView.image = grayscale.uiImage
}
} catch {
print(error)
}
- 去饱和会将您的图像转换为灰度图像
- 增加对比度会将那些灰色推向极端,即黑色和白色。
你可以CIColorControls
:
let ciImage = CIImage(image: image)!
let blackAndWhiteImage = ciImage.applyingFilter("CIColorControls", withInputParameters: ["inputSaturation": 0, "inputContrast": 5])
原文:
与inputContrast = 1
(默认):
与inputContrast = 5
:
在 Swift 5.1 中,我为 OSX 编写了一个扩展方法,它也可以与 NSImage 相互转换。它使用饱和度和输入对比度来转换图像。我抽象了一个黑白函数。
extension NSImage {
func blackAndWhite () -> NSImage?
{
return applying(saturation: 0,inputContrast: 5,image: self)
}
func applying(saturation value: NSNumber, inputContrast inputContrastValue: NSNumber, image:NSImage) -> NSImage? {
let ciImage = CIImage(data: image.tiffRepresentation!)!
let blackAndWhiteImage = ciImage.applyingFilter("CIColorControls", parameters: ["inputSaturation": value, "inputContrast": inputContrastValue])
let rep: NSCIImageRep = NSCIImageRep(ciImage: blackAndWhiteImage)
let nsImage: NSImage = NSImage(size: rep.size)
nsImage.addRepresentation(rep)
return nsImage
}
}
我正在为 iOS 应用程序构建一个扫描仪组件,到目前为止,我已经裁剪了结果图像并以正确的视角显示。 现在我需要将彩色图像变成黑白 "Scanned" 文档。
我尝试使用 - "CIPhotoEffectNoir" 但它的灰度等级高于全黑和白色。我希望获得 100% 黑色和 100% 白色的全对比度图像。
我怎样才能做到这一点? 谢谢
您可以使用 CIColorControls 并设置 Contrast Key kCIInputContrastKey
来增加 black/white 对比度,如下所示:
Xcode 9 • Swift 4
extension String {
static let colorControls = "CIColorControls"
}
extension UIImage {
var coreImage: CIImage? { return CIImage(image: self) }
}
extension CIImage {
var uiImage: UIImage? { return UIImage(ciImage: self) }
func applying(contrast value: NSNumber) -> CIImage? {
return applyingFilter(.colorControls, parameters: [kCIInputContrastKey: value])
}
func renderedImage() -> UIImage? {
guard let image = uiImage else { return nil }
return UIGraphicsImageRenderer(size: image.size,
format: image.imageRendererFormat).image { _ in
image.draw(in: CGRect(origin: .zero, size: image.size))
}
}
}
let url = URL(string: "https://i.stack.imgur.com/Xs4RX.jpg")!
do {
if let coreImage = UIImage(data: try Data(contentsOf: url))?.coreImage,
let increasedContrast = coreImage.applying(contrast: 1.5) {
imageView.image = increasedContrast.uiImage
// if you need to convert your image to data (JPEG/PNG) you would need to render the ciimage using renderedImage method on CIImage
}
} catch {
print(error)
}
要从颜色转换为灰度,您可以将饱和度键 kCIInputSaturationKey
设置为零:
extension CIImage {
func applying(saturation value: NSNumber) -> CIImage? {
return applyingFilter(.colorControls, parameters: [kCIInputSaturationKey: value])
}
var grayscale: CIImage? { return applying(saturation: 0) }
}
let url = URL(string: "https://i.stack.imgur.com/Xs4RX.jpg")!
do {
if let coreImage = UIImage(data: try Data(contentsOf: url))?.coreImage,
let grayscale = coreImage.grayscale {
// use grayscale image here
imageView.image = grayscale.uiImage
}
} catch {
print(error)
}
- 去饱和会将您的图像转换为灰度图像
- 增加对比度会将那些灰色推向极端,即黑色和白色。
你可以CIColorControls
:
let ciImage = CIImage(image: image)!
let blackAndWhiteImage = ciImage.applyingFilter("CIColorControls", withInputParameters: ["inputSaturation": 0, "inputContrast": 5])
原文:
与inputContrast = 1
(默认):
与inputContrast = 5
:
在 Swift 5.1 中,我为 OSX 编写了一个扩展方法,它也可以与 NSImage 相互转换。它使用饱和度和输入对比度来转换图像。我抽象了一个黑白函数。
extension NSImage {
func blackAndWhite () -> NSImage?
{
return applying(saturation: 0,inputContrast: 5,image: self)
}
func applying(saturation value: NSNumber, inputContrast inputContrastValue: NSNumber, image:NSImage) -> NSImage? {
let ciImage = CIImage(data: image.tiffRepresentation!)!
let blackAndWhiteImage = ciImage.applyingFilter("CIColorControls", parameters: ["inputSaturation": value, "inputContrast": inputContrastValue])
let rep: NSCIImageRep = NSCIImageRep(ciImage: blackAndWhiteImage)
let nsImage: NSImage = NSImage(size: rep.size)
nsImage.addRepresentation(rep)
return nsImage
}
}