Próbuję zmienić kolor UIImage. Mój kod:
-(UIImage *)coloredImage:(UIImage *)firstImage withColor:(UIColor *)color {
UIGraphicsBeginImageContext(firstImage.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[color setFill];
CGContextTranslateCTM(context, 0, firstImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetBlendMode(context, kCGBlendModeCopy);
CGRect rect = CGRectMake(0, 0, firstImage.size.width, firstImage.size.height);
CGContextDrawImage(context, rect, firstImage.CGImage);
CGContextClipToMask(context, rect, firstImage.CGImage);
CGContextAddRect(context, rect);
CGContextDrawPath(context,kCGPathElementMoveToPoint);
UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return coloredImg;
}
Ten kod działa, ale uzyskany obraz nie jest tak dobry, jak powinien: granice pikseli zwracanego obrazu są przerywane i nie są tak gładkie, jak na moim pierwszym obrazie. Jak mogę rozwiązać ten problem?
Odpowiedzi:
Od iOS 7 jest to najprostszy sposób na zrobienie tego.
Cel C:
Swift 2.0:
Swift 4.0:
Storyboard:
Najpierw skonfiguruj obraz jako szablon (na prawym pasku - Renderuj jako) w swoich zasobach. Wtedy kolor obrazu byłby zastosowanym kolorem odcienia.
źródło
theImageView.image? = (theImageView.image?.imageWithRenderingMode(.AlwaysTemplate))! theImageView.tintColor = UIColor.magentaColor()
img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [button setTintColor:[UIColor redColor]]; [button setImage:img forState:UIControlStateNormal];
@Ankish thanks!To jest prawie odpowiedź powyżej, ale nieco skrócona. To tylko traktuje obraz jako maskę i nie "rozmnaża się" ani nie koloruje obrazu.
Cel C:
Szybki:
źródło
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
ponieważ twoja wersja stworzy tylko grafikę inną niż siatkówka.Innym sposobem zabarwienia obrazu jest po prostu pomnożenie go przez stały kolor. Czasami jest to preferowane, ponieważ nie „podnosi” wartości kolorów w czarnych obszarach; utrzymuje względne natężenia obrazu na tym samym poziomie. Stosowanie nakładki jako odcienia ma tendencję do spłaszczania kontrastu.
Oto kod, którego używam:
Szybka wersja
źródło
W Swift 3.0
W Swift 2.0
Ciesz się pionierami Swift
źródło
Swift 4.2 Rozwiązanie
źródło
Począwszy od iOS 10 możesz używać
UIGraphicsImageRenderer
:źródło
Jeśli nie musisz robić tego programowo, możesz to zrobić za pomocą interfejsu użytkownika Xcode.
Jeśli przejdziesz do obrazu w folderze zasobów graficznych, otwórz inspektora po prawej stronie. Pojawi się menu „Renderuj jako” z następującymi opcjami:
Po wybraniu szablonu możesz zmienić tintColor obrazu w dowolny sposób - niezależnie od tego, czy używasz interfejsu użytkownika scenorysu Xcode, czy programowo.
Zobacz ten obraz:
źródło
Oto moja adaptacja odpowiedzi @ Anny. Dwie kluczowe kwestie:
destinationIn
trybu mieszaniaUIGraphicsBeginImageContextWithOptions(backgroundSize, false, UIScreen.main.scale)
aby uzyskać płynny obrazKod w Swift 3 :
źródło
self
wewnątrz swojej metody i usunąć niepotrzebny parametr obrazuOpierając się na odpowiedzi @ Anny, przepisuję na Swift 2.2 i obsługuję obraz z kanałem alfa:
źródło
Kod Anny działa dobrze przy kopiowaniu UIImage.image na kolorowym tle .image przy użyciu kCGBlendModeNormal zamiast kCGBlendModeMultiply. Na przykład,
self.mainImage.image = [self NormalImageByConstantColor: self.mainImage.image withColor: yourColor];
umieści zawartość mainImage.image nad tintą yourColor, zachowując krycie yourColor. To rozwiązało mój problem z umieszczeniem koloru tła z kryciem za obrazem, który ma zostać zapisany w Rolce z aparatu.źródło
Swift 3:
źródło
Wersja Swift 3.0 cudownego kodu Anny:
źródło
IOS 13 i nowsze:
let redImage = image.withTintColor(.red, renderingMode: .alwaysTemplate)
źródło