Swift - 去处图片的白色、黑色背景(使UIImage背景透明)
我之前写过一篇关于抠图的文章:Swift - 抠图,及图片合成功能的实现(适用于纯色背景)。其适用范围是纯色背景,但不能用与背景色是纯白或纯黑的情况。本文演示对于图片背景是白色或黑色的情况下,如何进行抠图。


3,样例代码
hangge_1496.zip
1,效果图
(1)点击“白底原图”“黑底原图”按钮可以切换显示白底或黑底的图片。
(2)点击“抠图”按钮后,将当前选择的图片的背景变成透明,并显示在 imageView 上。这里为了看出处理后的图片与原图的区别,我将 imageView 的背景色设为淡蓝色。
(3)点击“抠图并合成”按钮后,除了将原图的白色或黑色背景去处外,还会将处理后的图片与另一张图片进行合并显示。


2,扩展UIImage
我们这里对 UIImage 进行扩展,增加了处理白色背景与黑色背景的方法,调用后自动返回个背景透明的 UIImage。
extension UIImage {
//返回一个将白色背景变透明的UIImage
func imageByRemoveWhiteBg() -> UIImage? {
let colorMasking: [CGFloat] = [222, 255, 222, 255, 222, 255]
return transparentColor(colorMasking: colorMasking)
}
//返回一个将黑色背景变透明的UIImage
func imageByRemoveBlackBg() -> UIImage? {
let colorMasking: [CGFloat] = [0, 32, 0, 32, 0, 32]
return transparentColor(colorMasking: colorMasking)
}
func transparentColor(colorMasking:[CGFloat]) -> UIImage? {
if let rawImageRef = self.cgImage {
UIGraphicsBeginImageContext(self.size)
if let maskedImageRef = rawImageRef.copy(maskingColorComponents: colorMasking) {
let context: CGContext = UIGraphicsGetCurrentContext()!
context.translateBy(x: 0.0, y: self.size.height)
context.scaleBy(x: 1.0, y: -1.0)
context.draw(maskedImageRef, in: CGRect(x:0, y:0, width:self.size.width,
height:self.size.height))
let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return result
}
}
return nil
}
}
3,样例代码
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
//当前选择的图片图片
var originalImage:UIImage!
//白底图片
var image1 = UIImage(named: "flower.png")!
//黑底图片
var image2 = UIImage(named: "flower2.png")!
override func viewDidLoad() {
super.viewDidLoad()
originalImage = image1
}
//原图1
@IBAction func resetImage1(_ sender: AnyObject) {
originalImage = image1
self.imageView.image = originalImage
}
//原图2
@IBAction func resetImage2(_ sender: AnyObject) {
originalImage = image2
self.imageView.image = originalImage
}
//抠图
@IBAction func cutOut(_ sender: AnyObject) {
if originalImage == image1 {
imageView.image = originalImage.imageByRemoveWhiteBg()
}else{
imageView.image = originalImage.imageByRemoveBlackBg()
}
}
//抠图并合成
@IBAction func cutOutAndCompose(_ sender: AnyObject) {
//获取背景图
let bgImage = UIImage(named: "bg.png")!
//获取处理后的前景图
var flowerImage:UIImage
if originalImage == image1 {
flowerImage = originalImage.imageByRemoveWhiteBg()!
}else{
flowerImage = originalImage.imageByRemoveBlackBg()!
}
//开始图片处理上下文(由于输出的图不会进行缩放,所以缩放因子等于屏幕的scale即可
UIGraphicsBeginImageContextWithOptions(bgImage.size, false, 0)
//绘制背景
bgImage.draw(at: CGPoint.zero)
//绘制前景
flowerImage.draw(at: CGPoint.zero)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
//显示最终图片
imageView.image = newImage
}
//还原图片
@IBAction func resetImage(_ sender: AnyObject) {
self.imageView.image = originalImage
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
源码下载:
航歌不知道有没有时间写一篇关于OCR识别的。。。