gpt4 book ai didi

iphone - 如何在 iPhone 中为透明的 PNG 图像着色?

转载 作者:IT王子 更新时间:2023-10-29 07:31:51 24 4
gpt4 key购买 nike

我知道可以通过在其上绘制 CGContextFillRect 并设置混合模式来为矩形图像着色。但是,我无法弄清楚如何在透明图像(例如图标)上进行着色。这一定是可能的,因为 SDK 会在标签栏上自行完成。谁能提供一个片段?

更新:

自从我最初提出这个问题以来,已经针对这个问题给出了很多很好的建议。请务必通读所有答案,找出最适合您的答案。

更新(2015 年 4 月 30 日):

在 iOS 7.0 中,我现在只需执行以下操作即可满足我最初问题的需求。但如果您有更复杂的案例,请查看所有答案。

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

最佳答案

更新:这是一个Gist使用以下代码获取 Swift UIColor 扩展。


如果您有一个灰度图像并且希望白色成为着色颜色kCGBlendModeMultiply 是可行的方法。使用这种方法,您的高光不会比您的着色颜色更亮。

相反,如果您有一张非灰度图像您有高光阴影 应该保留,混合模式 kCGBlendModeColor是要走的路。由于保留了图像的亮度,白色将保持白色,黑色将保持黑色。此模式仅用于着色 - 它与 Photoshop 的 Color 图层混合模式相同(免责声明:结果可能会略有不同)。

请注意,无论是在 iOS 还是在 Photoshop 中,对 alpha 像素进行着色都无法正常工作 - 半透明的黑色像素不会保持黑色。我更新了下面的答案来解决这个问题,我花了很长时间才找到答案。

您还可以使用其中一种混合模式 kCGBlendModeSourceIn/DestinationIn 而不是 CGContextClipToMask

如果你想创建一个UIImage,下面的每个代码段都可以被下面的代码包围:

UIGraphicsBeginImageContextWithOptions (myIconImage.size, NO, myIconImage.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();

下面是使用 kCGBlendModeColor 为透明图像着色的代码:

// 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);

如果你的图像没有半透明像素,你也可以用 kCGBlendModeLuminosity 反过来做:

// 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);

如果您不关心光度,因为您只有一张带有 alpha channel 的图像应该用颜色着色,您可以用更有效的方式来实现:

// 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);

或者反过来:

// 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);

玩得开心!

关于iphone - 如何在 iPhone 中为透明的 PNG 图像着色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3514066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com