Как тонировать прозрачное изображение PNG в iPhone? - PullRequest
73 голосов
/ 18 августа 2010

Я знаю, что можно тонировать прямоугольное изображение, рисуя поверх него CGContextFillRect и устанавливая режим наложения. Однако я не могу понять, как сделать оттенок на прозрачном изображении, таком как значок. Это должно быть возможно, так как SDK сам делает это на вкладках. Кто-нибудь сможет предоставить фрагмент?

UPDATE:

Много замечательных предложений было дано для этой проблемы, так как я первоначально спросил. Обязательно прочитайте все ответы, чтобы выяснить, что подходит вам больше всего.

ОБНОВЛЕНИЕ (30 апреля 2015 г.):

С iOS 7.0 я теперь могу просто сделать следующее, что удовлетворит потребности моего первоначального вопроса. Но если у вас есть более сложные случаи, проверьте все ответы.

UIImage *iconImage = [[UIImage imageNamed:@"myImageName"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];    
UIImageView *icon = [[UIImageView alloc] initWithImage:iconImage];
icon.tintColor = [UIColor redColor];

Ответы [ 13 ]

1 голос
/ 24 июля 2013

Я хотел затенить мои изображения в моем собственном подклассе UIButton, и другие решения не сделали то, что я хотел. Мне нужно было затемнить «оттенок» цвета изображения. Вот как можно изменить яркость с помощью CoreImage.

Custom buttons with shaded images on button press

  1. Убедитесь, что вы добавили CoreImage.framework в библиотеки вашего проекта. (Связь бинарных с библиотеками)

  2. Метод затенения UIImage

    - (UIImage *)shadeImage:(UIImage *)image {
     CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];
    
     CIContext *context = [CIContext contextWithOptions:nil];
    
     CIFilter *filter = [CIFilter filterWithName:@"CIColorControls"
                                  keysAndValues:kCIInputImageKey, inputImage,
                        @"inputBrightness", [NSNumber numberWithFloat:-.5], nil];
     CIImage *outputImage = [filter outputImage];
    
     CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]];
     UIImage *newImage = [UIImage imageWithCGImage:cgImage scale:image.scale orientation:image.imageOrientation];
     CGImageRelease(cgImage);
    
     return newImage;
    }
    
  3. Вы захотите сохранить копию контекста в виде ивара, а не воссоздать его.

1 голос
/ 14 марта 2012

Не моя работа, но я успешно использовал этот подход:

http://coffeeshopped.com/2010/09/iphone-how-to-dynamically-color-a-uiimage

0 голосов
/ 15 января 2013

Сначала я хочу поблагодарить fabb за его исключительное решение, которое помогло мне выполнить мою задачу по подкрашиванию полупрозрачных значков.Поскольку мне нужно было решение для C # (Monotouch), мне пришлось переводить его код.Вот что я придумал.Просто скопируйте и вставьте это в свой код и добавьте полупрозрачное изображение и все готово.

Итак, все кредиты снова отправляются в fabb.Это просто начало C # пользователей:)

//TINT COLOR IMAGE
UIImageView iImage = new UIImageView(new RectangleF(12, 14, 24,24));
iImage.ContentMode = UIViewContentMode.ScaleAspectFit;
iImage.Image = _dataItem.Image[0] as UIImage;

UIGraphics.BeginImageContextWithOptions(iImage.Bounds.Size, false, UIScreen.MainScreen.Scale);
CGContext context = UIGraphics.GetCurrentContext();

context.TranslateCTM(0, iImage.Bounds.Size.Height);
context.ScaleCTM(1.0f, -1.0f);

RectangleF rect = new RectangleF(0,0, iImage.Bounds.Width, iImage.Bounds.Height);

// draw black background to preserve color of transparent pixels
context.SetBlendMode(CGBlendMode.Normal);
UIColor.Black.SetFill();
context.FillRect(rect);

// draw original image
context.SetBlendMode(CGBlendMode.Normal);
context.DrawImage(rect, iImage.Image.CGImage);

// tint image (loosing alpha) - the luminosity of the original image is preserved
context.SetBlendMode(CGBlendMode.Color);
UIColor.Orange.SetFill();
context.FillRect(rect);

// mask by alpha values of original image
context.SetBlendMode(CGBlendMode.DestinationIn);
context.DrawImage(rect, iImage.Image.CGImage);

UIImage coloredImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();

iImage = new UIImageView(coloredImage);
iImage.Frame = new RectangleF(12, 14, 24,24);
//END TINT COLOR IMAGE

cell.Add(iImage);
...