【问题标题】:How to change the color of an UIImage如何更改 UIImage 的颜色
【发布时间】:2012-06-01 02:30:45
【问题描述】:

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

因为我有标准表单,我可以从弹出框移动到视图。
在我的应用程序中,可以将图像修补为一个大图像,即一张桌子。
此外,我想将颜色更改为白棕色或其他颜色。

但问题是:我只能更改背景颜色
有什么办法可以改变 UIImage 的颜色吗?

提前谢谢你

【问题讨论】:

  • 你真的需要更详细地解释你想要做什么。
  • 一个图像视图显示一个图像,那么你说的“改变颜色”是什么意思?
  • 编辑了我的帖子。我希望它是可以理解的

标签: ios uiimage uicolor


【解决方案1】:

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

Obj-C:

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

斯威夫特 2:

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

斯威夫特 3:

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

【讨论】:

  • 完美答案,但是我们可以只用新颜色填充内框而不改变UIImage的边框颜色吗?
  • @YogeshSuthar “边框颜色”是什么意思?
  • 图像的边框颜色。假设我有一个边框颜色为灰色的图像。这种灰色不应该改变,但内部颜色应该改变。
  • @skywinder,有没有办法检测颜色并更改特定颜色?就像我有 2 色图像白色和红色。我只想更改图像的白色部分。有可能吗?
  • @MrugeshTank 使用这种方法 - 不。它只是从图像创建蒙版并用颜色填充它。因此,您为此需要一些高级图像处理库。
【解决方案2】:
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;

【讨论】:

  • 非常感谢。我对声明 imageView.image = img; 有问题但随后将其更改为 [testTest.newView setImage: img];
  • 覆盖?你什么意思?
  • 我有一个 png,它是一个三角形。因此,如果我使用您的方法,则不是三角形获得颜色,而是图像的背景。最后没有三角形,而是一个红色的正方形
  • 我已经编辑了答案,但下次你应该在你的问题中表达可以理解。真的很难理解你想要什么。
  • 谢谢。我只是在看这个试图理解它。我的一个问题是它是如何开始的?
【解决方案3】:

对于 swift 3.2 和 4

extension UIImageView{
    func changePngColorTo(color: UIColor){
        guard let image =  self.image else {return}
        self.image = image.withRenderingMode(.alwaysTemplate)
        self.tintColor = color
    }
}

使用:

self.yourImageView.changePngColorTo(color: .red)

【讨论】:

  • 这不会改变 UIImage 的颜色。而是图像视图用不同的颜色渲染它。
【解决方案4】:

详情

  • Xcode 10.2.1 (10E1001)、Swift 5

方式一、扩展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) {
            guard let image = image else { return }
            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 {

    weak var colorSwitchButton: UIBarButtonItem?

    private var imageViews = [ImageView]()
    private var appleImage: UIImage { return UIImage(imageName: "apple")! }
    private var redAppleImage: UIImage { return UIImage(imageName: "red_apple")! }

    override func viewDidLoad() {
        super.viewDidLoad()
        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)

        let buttonItem = UIBarButtonItem(title: "switch", style: .plain, target: self,
                                         action: #selector(colorSwitchButtonTouchedUpInside(_:)))
        navigationItem.rightBarButtonItem = buttonItem
        colorSwitchButton = buttonItem
        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) {
                navigationItem.title = "Original colors"
                for imageView in imageViews {
                    switch imageView.imageColorTransformType {
                    case .imageExtension: imageView.image = imageView.image?.imageWithColor(newColor: nil)
                    case .imageViewExtension: imageView.imageColor = nil
                    case .none: break
                    }
                }
            } else {
                navigationItem.title = "Template colors"
                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
                    }
                }
            }
        }
        get { return _useOriginalColors }
    }

    @objc func colorSwitchButtonTouchedUpInside(_ sender: Any) { useOriginalColors = !useOriginalColors }
}

故事板

结果

【讨论】:

    【解决方案5】:

    您也可以使用以下代码快速执行此操作:

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

    【讨论】:

      【解决方案6】:

      Swift + 界面构建器(故事板)

      如果您在界面生成器中添加了 UIImageView:

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

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

      【讨论】:

        【解决方案7】:

        在 UIImageView 中改变图片的颜色:

        public extension UIImageView {
            func tintImage(color: UIColor) {
                image = image?.tint(color: color)
            }
        }
        

        只需调用方法:

        imageView.tintImage(color: .red)
        

        【讨论】:

          【解决方案8】:

          添加到skywinder's answer

          您也可以在按钮上执行此操作:

          UIImage *image = [UIImage imageNamed:@"foo.png"];
          [myButton setImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal];
          [myButton setTintColor:[UIColor redColor]];
          

          【讨论】:

            猜你喜欢
            • 2018-08-20
            • 1970-01-01
            • 1970-01-01
            • 2012-09-05
            • 2016-08-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多