SORU
18 AĞUSTOS 2010, ÇARŞAMBA


Nasıl iPhone şeffaf bir PNG görüntü renk?

Olası bir CGContextFillRect çizim ve karışım modunu ayarlayarak dikdörtgen bir görüntü renk olduğunu biliyorum. Ancak, bir simge gibi saydam bir görüntü üzerinde bir renk tonu nasıl yapacağımı çözemedim. SDK bu sekme çubukları kendi kendini yok çünkü mümkün olmalıdır. Herkes bir parçacık sağlamak için mümkün olur?

GÜNCELLEME:

Büyük öneriler bir sürü aslında madem bu sorun için verilmiştir. Tüm cevaplar sizin için en uygun ne olduğunu anlamak için okuyun emin olun.

GÜNCELLEME (30, 2015 Nisan):

İle iOS şimdi sadece şunu yapabilirim, benim asıl sorum ihtiyaçlarını tatmin edecek 7.0,. Ama eğer daha karmaşık bir vaka varsa, cevapları kontrol edin.

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

CEVAP
11 EYLÜL 2011, Pazar


Eğer varsasiyah-beyaz görüntüve istiyorumbeyaz renklendirme renk olur, kCGBlendModeMultiply gitmek için bir yoldur. Bu yöntem ile yapamazsınız olayları renklendirme rengi daha açık.

Eğer ya da varsa tam tersineolmayan siyah-beyaz görüntü,YAvarvurgularvegölgelerbu muhafaza edilmelidir, karışım modu kCGBlendModeColor gitmek için bir yoldur. Beyaz ve görüntünün açıklık korunmuş olarak kalacak siyah beyaz siyah kalacak. Bu mod sadece renklendirme için yapılır - Photoshop Color olarak aynı katman harmanlama modu (Yasal Uyarı: sonuçlar ortaya çıkabilir biraz farklı).

Alfa-piksel doğru ne Photoshop - yarı şeffaf siyah piksel olarak iOS ne de çalışmaz renklendirme siyah kalacağını unutmayın. Cevap aşağıda bu soruna geçici bir çözüm bulmak için oldukça uzun bir zaman aldı güncelledi.

Ayrıca CGContextClipToMask yerine karışım modları 10 ** birini kullanabilirsiniz.

Aşağıdaki kodu UIImage, her oluşturmak istiyorsanız bölümleri aşağıdaki kodu çevrili olabilir:

UIGraphicsBeginImageContextWithOptions (myIconImage.size, NO, [[UIScreen mainScreen] scale]); // for correct resolution on retina, thanks @MobileVet
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextTranslateCTM(context, 0, myIconImage.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

CGRect rect = CGRectMake(0, 0, myIconImage.size.width, myIconImage.size.height);

// image drawing code here

UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Burada kCGBlendModeColor ile şeffaf bir resim renklendirme için kod:

// draw black background to preserve color of transparent pixels
CGContextSetBlendMode(context, kCGBlendModeNormal);
[[UIColor blackColor] setFill];
CGContextFillRect(context, rect);

// draw original image
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);

// tint image (loosing alpha) - the luminosity of the original image is preserved
CGContextSetBlendMode(context, kCGBlendModeColor);
[tintColor setFill];
CGContextFillRect(context, rect);

// mask by alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);

Eğer resim yarı saydam pikseller varsa, o da tam tersi kCGBlendModeLuminosity ile yapabilirsin:

// draw tint color
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);

// replace luminosity of background (ignoring alpha)
CGContextSetBlendMode(context, kCGBlendModeLuminosity);
CGContextDrawImage(context, rect, myIconImage.CGImage);

// mask by alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);

Eğer sadece bir renk ile boyanmış olması gereken bir alfa kanalı ile bir görüntü var gibi parlaklık için umursamıyorsun bile, daha verimli bir şekilde olabilir

// draw tint color
CGContextSetBlendMode(context, kCGBlendModeNormal);
[tintColor setFill];
CGContextFillRect(context, rect);

// mask by alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeDestinationIn);
CGContextDrawImage(context, rect, myIconImage.CGImage);

ya da tam tersi:

// draw alpha-mask
CGContextSetBlendMode(context, kCGBlendModeNormal);
CGContextDrawImage(context, rect, myIconImage.CGImage);

// draw tint color, preserving alpha values of original image
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
[tintColor setFill];
CGContextFillRect(context, rect);

İyi eğlenceler!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • A Alkhaldi

    A Alkhaldi

    12 Mayıs 2007
  • DigitalRev TV

    DigitalRev T

    30 AĞUSTOS 2007
  • Shantanu Sood

    Shantanu Soo

    3 Kasım 2008