Вопрос по ios – Как изменить цвет UIImage

41

Я не хочу изменять backgroundColor UIImage,
а точнее изменить цвет всего изображения.

Потому что у меня есть стандартные формы, которые я могу перейти от поповера к представлению.
В моем приложении можно привязать изображения к одному большому изображению, то есть к таблице.
Кроме того, я хочу изменить цвет на белый коричневый или что-то еще.

Но проблема в том, что я могу изменить только цвет фона.
Есть ли способ изменить цвет UIImage?

заранее спасибо

отредактировал мой пост. Надеюсь понятно Studie
изображение показывает изображение, так что вы имеете в виду, когда говорите "изменить цвет"? Cthutu
Вам действительно нужно более подробно объяснить, что вы пытаетесь сделать. picknick

Ваш Ответ

6   ответов
4

Way 1. Extension 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
    }
}

Usage

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)
Way 2. Extension 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
        }
    }
}

Usage

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
Full sample
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
        }
    }
}
Storyboard

enter image description here

Result

enter image description here enter image description here

Details

Добро пожаловать) создайте лучшее приложение!)
114

easy way за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
@YogeshSuthar, что вы подразумеваете под "цвет границы"?
@skywinder, есть ли способ обнаружить цвет и изменить определенный цвет? Как у меня есть 2 цветное изображение, белое и красное. Я хочу изменить только белую часть изображения. Является ли это возможным?
Идеальный ответ, но можем ли мы просто заполнить внутреннюю рамку новым цветом, а не менять цвет границыUIImage?
@MrugeshTank с этим методом - нет. просто создайте маску из изображения и залейте ее цветом. Итак, для этого вам понадобятся передовые библиотеки обработки изображений.
Цвет границы изображения. Предположим, у меня есть изображение с серым цветом границы. Этот серый цвет не должен меняться, но внутренний цвет должен меняться.
58
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]; Studie
но этот метод перезаписывает мое изображение. Что случилось? Studie
У меня есть PNG, который является треугольником. Поэтому, если я использую ваш метод, получим не треугольник, а цвет фона. В конце нет треугольника, но есть квадрат, который имеет красный цвет Studie
Я редактирую ответ, но в следующий раз вы должны выразить понятность вашего вопроса. Было действительно сложно понять, чего ты хочешь.
4

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

tintedImage.tintColor = UIColor.redColor()
5

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. Скорее, изображение отображается с другим цветом.
0

Если вы добавили UIImageView в конструктор интерфейса:

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

гдеmyIcon это выход из вашей раскадровки, например:@IBOutlet weak var myIcon: UIImageView!

Похожие вопросы