2015-02-10 4 views
24

Я получаю изображение с сервера, а затем, исходя из цвета, выбранного пользователем, цвет изображения будет изменен.Как изменить изображение tintColor

Я попытался следующие:

_sketchImageView.image = [_sketchImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
[_sketchImageView setTintColor:color]; 

я получил противоположность своей цели (белый цвет снаружи UIImage окрашена с выбранным цветом).

Что пойдет не так?

Мне нужно сделать то же самое в этом вопросе, предоставленное решение не решит мой случай. How can I change image tintColor in iOS and WatchKit

+0

Если вы хотите, чтобы заполнить изображение с каким цветом вам нужно более продвинутым решение. Например: https://github.com/mxcl/UIImageWithColor – orkenstein

+0

Я думаю, что вам нужен эффект цвета фона, попробуйте '[_sketchImageView setBackgroundColor: color]' – Saif

+0

Я пробовал это решение раньше, и он дает тот же результат. // UIImage * img = [UIImage resizableImageWithColor: color cornerRadius: 10]; // UIImage * img = [UIImage imageWithColor: размер цвета: CGSizeMake (20, 20)]; UIImage * img = [UIImage imageWithColor: color]; _sketchImageView.image = img; – user2168496

ответ

45

Попробуйте сформировать новый образ для себя

UIImage *newImage = [_sketchImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
UIGraphicsBeginImageContextWithOptions(image.size, NO, newImage.scale); 
[yourTintColor set]; 
[newImage drawInRect:CGRectMake(0, 0, image.size.width, newImage.size.height)]; 
newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

_sketchImageView.image = newImage; 

и использовать его.

Успехов

======= ======= UPDATE

Это решение будет только изменение цвета изображения все пикселя.

Пример: у нас есть книги файл: http://pngimg.com/upload/book_PNG2113.png

enter image description here

И после того, как работает над кодом (Exp: TintColor красный). Мы имеем:

enter image description here

SO: , как ваш образ зависит от того, как вы создали его

+0

thanx много, скажем, что у меня есть изображение книги, это решение покрасило изображение за пределами границ книги. Я хочу, чтобы противоположность, то есть сама книга, была окрашена. любая идея, почему это происходит? – user2168496

+0

Думаю, вам нужно перепроектировать образ вашей книги. Я только что редактировал свой пост. Посмотрите это – VietHung

+0

Yeah.yessss .. я пробовал ваш образ, и он отлично работает :) Я действительно ценю, что – user2168496

2

Вы можете попробовать:

_sketchImageView.image = [self imageNamed:@"imageName" withColor:[UIColor blackColor]]; 

- (UIImage *)imageNamed:(NSString *)name withColor:(UIColor *)color 
{ 
    // load the image 
    //NSString *name = @"badge.png"; 
    UIImage *img = [UIImage imageNamed:name]; 

    // begin a new image context, to draw our colored image onto 
    UIGraphicsBeginImageContext(img.size); 

    // get a reference to that context we created 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // set the fill color 
    [color setFill]; 

    // translate/flip the graphics context (for transforming from CG* coords to UI* coords 
    CGContextTranslateCTM(context, 0, img.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    // set the blend mode to color burn, and the original image 
    CGContextSetBlendMode(context, kCGBlendModeColorBurn); 
    CGRect rect = CGRectMake(0, 0, img.size.width, img.size.height); 
    CGContextDrawImage(context, rect, img.CGImage); 

    // set a mask that matches the shape of the image, then draw (color burn) a colored rectangle 
    CGContextClipToMask(context, rect, img.CGImage); 
    CGContextAddRect(context, rect); 
    CGContextDrawPath(context,kCGPathFill); 

    // generate a new UIImage from the graphics context we drew onto 
    UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    //return the color-burned image 
    return coloredImg; 
} 
+0

этот код дает CGContextDrawImage: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека использует недопустимый контекст и тем самым способствует общему ухудшению стабильности и надежности системы. Это уведомление является любезностью: устраните эту проблему. Это станет фатальной ошибкой в ​​предстоящем обновлении. любая идея plz? – user2168496

+0

Проверьте, не является ли ваш экземпляр UIImageView незаполненным. Если метод не вызывается против пустого UIIMageView. – gabriel

+0

Да, есть изображение, изображение отображается в представлении изображения, после чего пользователь выбирает цвет, я хочу, чтобы его цвет был изменен. – user2168496

4

Попробуйте что-то вроде этого

UIImage *originalImage = _sketchImageView.image 
UIImage *newImage = [originalImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,50,50)]; // your image size 
imageView.tintColor = [UIColor redColor]; // or whatever color that has been selected 
imageView.image = newImage; 
_sketchImageView.image = imageView.image; 

Надеется, что это помогает.

+0

thanx для справки, но это изменяет изображение на белое изображение (так как оно пустое) – user2168496

+0

Итак, вы говорите, что ваш _sketchImageView.image пуст? – Gismay

+0

Нет, это не так. Значит, после применения кода я получил белое изображение – user2168496

1

Попробуйте установить цвет оттенка в режиме просмотра изображения. Например. [self.view setTintColor:color];

16

В Swift вы можете использовать это расширение: [на основе @ VietHung-х Objective-C решения]


extension UIImage { 
    func imageWithColor(color: UIColor) -> UIImage? { 
     var image = imageWithRenderingMode(.AlwaysTemplate) 
     UIGraphicsBeginImageContextWithOptions(size, false, scale) 
     color.set() 
     image.drawInRect(CGRect(x: 0, y: 0, width: size.width, height: size.height)) 
     image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    } 
} 
0

Вот как я применяю и использую оттенки в IOS 9 с Swift.

//apply a color to an image 
//ref - http://stackoverflow.com/questions/28427935/how-can-i-change-image-tintcolor 
//ref - https://www.captechconsulting.com/blogs/ios-7-tutorial-series-tint-color-and-easy-app-theming 
func getTintedImage() -> UIImageView { 

    var image  : UIImage; 
    var imageView : UIImageView; 

    image = UIImage(named: "someAsset")!; 
    let size : CGSize = image.size; 
    let frame : CGRect = CGRectMake((UIScreen.mainScreen().bounds.width-86)/2, 600, size.width, size.height); 

    let redCover : UIView = UIView(frame: frame); 

    redCover.backgroundColor = UIColor.redColor(); 
    redCover.layer.opacity = 0.75; 

    imageView  = UIImageView(); 
    imageView.image = image.imageWithRenderingMode(UIImageRenderingMode.Automatic); 

    imageView.addSubview(redCover); 

    return imageView; 
} 
3

В Swift 3.0 вы можете использовать это расширение: [на основе @ VietHung-х Objective-C решения]

extension UIImage { 
    func imageWithColor(_ color: UIColor) -> UIImage? { 
     var image = imageWithRenderingMode(.alwaysTemplate) 
     UIGraphicsBeginImageContextWithOptions(size, false, scale) 
     color.set() 
     image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height)) 
     image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    } 
} 
12

В быстром 2.0 Вы можете использовать этот

let image = UIImage(named:"your image name")?.imageWithRenderingMode(.AlwaysTemplate) 
let yourimageView.tintColor = UIColor.redColor() 
yourimageView.image = image 

В быстром 3.0 вы можете использовать этот

let image = UIImage(named:"your image name")?.withRenderingMode(.alwaysTemplate) 
let yourimageView.tintColor = UIColor.red 
yourimageView.image = image 
+2

Для Swift 3.0, вы хотите использовать withRenderingMode, а не imageWithRenderingMode. – Joe

1

Для Swift 3.0, я сделал пользовательский подкласс UIImageView называется TintedUIImageView. Теперь изображение использует любой оттенок цвета устанавливается в интерфейсе строителя или код

class TintedUIImageView: UIImageView { 

    override func awakeFromNib() { 
     if let image = self.image { 
      self.image = image.withRenderingMode(.alwaysTemplate) 
     } 
    } 
} 
+0

Добро пожаловать в SO! Ваш ответ выглядит скорее как комментарий, а не как ответ. Когда у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы сможете [комментировать] (http://stackoverflow.com/help/privileges/comment) в любой записи. Также проверьте это [что я могу сделать вместо этого] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). Если вы намеревались ответить, прочитайте это [как-ответ] (http://stackoverflow.com/help/how-to-answer), чтобы следовать рекомендациям SO. – thewaywewere

0

Одна вещь, вы можете сделать это, просто добавьте ваши изображения в папку Assets в XCode, а затем изменить режим рендеринга изображения шаблона, поэтому каждый раз, когда вам измените цвет оттенка UIImageView, он автоматически изменит изображение.

Проверить эту ссылку из ->https://www.google.co.in/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&cad=rja&uact=8&ved=0ahUKEwiM0YXO0ejTAhUIQ48KHfGpBpgQjRwIBw&url=https%3A%2F%2Fkrakendev.io%2Fblog%2F4-xcode-asset-catalog-secrets-you-need-to-know&psig=AFQjCNGnAzVn92pCqM8612o1R0J9q1y7cw&ust=1494619445516498

Смежные вопросы