如何改变UIImage的颜色

我不想改变UIImage的backgroundColor,
而是改变整个图像的颜色。

因为我有标准的表格,我可以从popover移动到视图。
在我的应用程序中,可以将图像修改为一个大的图像,即表格。
此外,我想改变颜色为白色棕色或其他。

但问题是:我只能改变backgroundColor
有没有办法改变UIImage的颜色?

先谢谢你

UIImage *image = [UIImage imageNamed:@"triangle.png"]; CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextClipToMask(context, rect, image.CGImage); CGContextSetFillColorWithColor(context, [[UIColor redColor] CGColor]); CGContextFillRect(context, rect); UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImage *flippedImage = [UIImage imageWithCGImage:img.CGImage scale:1.0 orientation: UIImageOrientationDownMirrored]; yourUIImageView.image = flippedImage; 

接受的答案是正确的,但有一个更简单的方法UIImageView

OBJ-C:

 UIImage *image = [UIImage imageNamed:@"foo.png"]; theImageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [theImageView setTintColor:[UIColor redColor]]; 

Swift 2:

 let theImageView = UIImageView(image: UIImage(named:"foo")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)) theImageView.tintColor = UIColor.redColor() 

Swift 3:

 let theImageView = UIImageView(image: UIImage(named:"foo")!.withRenderingMode(.alwaysTemplate)) theImageView.tintColor = UIColor.red 

你也可以用下面的代码在swift中做到这一点:

 // language: Swift let tintedImage = UIImageView(image: UIImage(named:"whatever")!.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)) tintedImage.tintColor = UIColor.redColor() 

Swift 3,xcode 8.1

方式1.扩展UIImage

来源: https : //stackoverflow.com/a/40177870/4488252

 extension UIImage { convenience init?(imageName: String) { self.init(named: imageName)! accessibilityIdentifier = imageName } // https://stackoverflow.com/a/40177870/4488252 func imageWithColor (newColor: UIColor?) -> UIImage? { if let newColor = newColor { UIGraphicsBeginImageContextWithOptions(size, false, scale) let context = UIGraphicsGetCurrentContext()! context.translateBy(x: 0, y: size.height) context.scaleBy(x: 1.0, y: -1.0) context.setBlendMode(.normal) let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height) context.clip(to: rect, mask: cgImage!) newColor.setFill() context.fill(rect) let newImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() newImage.accessibilityIdentifier = accessibilityIdentifier return newImage } if let accessibilityIdentifier = accessibilityIdentifier { return UIImage(imageName: accessibilityIdentifier) } return self } } 

用法

 let imageView = UIImageView(frame: CGRect(x: 40, y: 250, width: 40, height: 40)) view.addSubview(imageView) // Set color imageView.image = UIImage(imageName: "Apple")?.imageWithColor(newColor: UIColor.blue) // Reset color //imageView.image = imageView.image?.imageWithColor(newColor: nil) 

方式2.扩展UIImageView

  extension UIImageView { var imageColor: UIColor? { set (newValue) { if let image = image { if newValue != nil { self.image = image.withRenderingMode(.alwaysTemplate) tintColor = newValue } else { self.image = image.withRenderingMode(.alwaysOriginal) tintColor = UIColor.clear } } } get { return tintColor } } } 

用法

 let imageView = UIImageView(frame: CGRect(x: 40, y: 250, width: 40, height: 40)) view.addSubview(imageView) imageView.image = UIImage(imageName: "Apple") // Set color imageView.imageColor = UIColor.green // Reset color //imageView.imageColor = nil 

完整的样品

 import UIKit class ImageView: UIImageView { enum ImageColorTransformType { case None, ImageExtension, ImageViewExtension } var imageColorTransformType = ImageColorTransformType.None } class ViewController: UIViewController { @IBOutlet weak var colorSwitcher: UIButton! var imageViews = [ImageView]() private var appleImage: UIImage { return UIImage(imageName: "Apple")! } private var redAppleImage: UIImage { return UIImage(imageName: "RedApple")! } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. createNewImageView(x: 40, y:100, image:appleImage, imageColorTransformType: .None) createNewImageView(x: 100, y:100, image:appleImage, imageColorTransformType: .ImageExtension) createNewImageView(x: 160, y:100, image:appleImage, imageColorTransformType: .ImageViewExtension) createNewImageView(x: 40, y:160, image:redAppleImage, imageColorTransformType: .None) createNewImageView(x: 100, y:160, image:redAppleImage, imageColorTransformType: .ImageExtension) createNewImageView(x: 160, y:160, image:redAppleImage, imageColorTransformType: .ImageViewExtension) useOriginalColors = false } private func createNewImageView(x:CGFloat, y: CGFloat, image: UIImage, imageColorTransformType: ImageView.ImageColorTransformType) { let imageView = ImageView(frame: CGRect(x: x, y: y, width: 40, height: 40)) imageView.image = image imageView.imageColorTransformType = imageColorTransformType imageViews.append(imageView) view.addSubview(imageView) } private var _useOriginalColors = false private var useOriginalColors: Bool { set(value) { _useOriginalColors = value if (!value) { colorSwitcher.setTitle("Original", for: .normal) for imageView in imageViews { switch imageView.imageColorTransformType { case .ImageExtension: imageView.image = imageView.image?.imageWithColor(newColor: UIColor.blue) case .ImageViewExtension: imageView.imageColor = UIColor.green case .None: break } } } else { colorSwitcher.setTitle("Template", for: .normal) for imageView in imageViews { switch imageView.imageColorTransformType { case .ImageExtension: imageView.image = imageView.image?.imageWithColor(newColor: nil) case .ImageViewExtension: imageView.imageColor = nil case .None: break } } } } get { return _useOriginalColors } } @IBAction func switchColors(_ sender: Any) { useOriginalColors = !useOriginalColors } } extension UIImage { convenience init?(imageName: String) { self.init(named: imageName)! accessibilityIdentifier = imageName } // https://stackoverflow.com/a/40177870/4488252 func imageWithColor (newColor: UIColor?) -> UIImage? { if let newColor = newColor { UIGraphicsBeginImageContextWithOptions(size, false, scale) let context = UIGraphicsGetCurrentContext()! context.translateBy(x: 0, y: size.height) context.scaleBy(x: 1.0, y: -1.0) context.setBlendMode(.normal) let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height) context.clip(to: rect, mask: cgImage!) newColor.setFill() context.fill(rect) let newImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() newImage.accessibilityIdentifier = accessibilityIdentifier return newImage } if let accessibilityIdentifier = accessibilityIdentifier { return UIImage(imageName: accessibilityIdentifier) } return self } } extension UIImageView { var imageColor: UIColor? { set (newValue) { if let image = image { if newValue != nil { self.image = image.withRenderingMode(.alwaysTemplate) tintColor = newValue } else { self.image = image.withRenderingMode(.alwaysOriginal) tintColor = UIColor.clear } } } get { return tintColor } } } 

故事板

在这里输入图像说明

结果

在这里输入图像说明 在这里输入图像说明

细节

Swift 3,xcode 8.1

Swift 3 +界面构build器(storyboard)

如果您在界面构build器中添加了UIImageView:

 myIcon.image = myIcon.image!.withRenderingMode(UIImageRenderingMode.alwaysTemplate) myIcon.tintColor = UIColor.red // your color 

myIcon是你的故事板的出口,例如: @IBOutlet weak var myIcon: UIImageView!