我想更改不透明图像的颜色。我的原图如下:
我想把图像转换成以下格式
所以,基本上我想把图像中的红色转换成黑色(任何其他颜色)。上面两个图像是为了更好地理解而添加的。
注意:首先,你需要用Photoshop或任何其他工具将你的图像背景设置为透明。
然后使用下面的代码。
简单地说,您需要使用渲染模式来更改此颜色。
cokeImageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; // yourimageviewname
[cokeImageView setTintColor:[UIColor blackColor]];
你可以用这个
theImageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[theImageView setTintColor:[UIColor blackColor]];
我在“重复”上看不到任何答案(这个问题不应该被标记为重复),它可以让你用另一种颜色替换给定的颜色,并处理不透明的图像,所以我决定添加一个。
我创建了一个UIImage
类别来实现这一点,它基本上是通过循环每个像素,检测它与给定颜色的接近程度,并将其与替换颜色混合(如果是)。
这将适用于具有透明和不透明背景的图像。
@implementation UIImage (UIImageColorReplacement)
-(UIImage*) imageByReplacingColor:(UIColor*)sourceColor withMinTolerance:(CGFloat)minTolerance withMaxTolerance:(CGFloat)maxTolerance withColor:(UIColor*)destinationColor {
// components of the source color
const CGFloat* sourceComponents = CGColorGetComponents(sourceColor.CGColor);
UInt8* source255Components = malloc(sizeof(UInt8)*4);
for (int i = 0; i < 4; i++) source255Components[i] = (UInt8)round(sourceComponents[i]*255.0);
// components of the destination color
const CGFloat* destinationComponents = CGColorGetComponents(destinationColor.CGColor);
UInt8* destination255Components = malloc(sizeof(UInt8)*4);
for (int i = 0; i < 4; i++) destination255Components[i] = (UInt8)round(destinationComponents[i]*255.0);
// raw image reference
CGImageRef rawImage = self.CGImage;
// image attributes
size_t width = CGImageGetWidth(rawImage);
size_t height = CGImageGetHeight(rawImage);
CGRect rect = {CGPointZero, {width, height}};
// bitmap format
size_t bitsPerComponent = 8;
size_t bytesPerRow = width*4;
CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big;
// data pointer
UInt8* data = calloc(bytesPerRow, height);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// create bitmap context
CGContextRef ctx = CGBitmapContextCreate(data, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo);
CGContextDrawImage(ctx, rect, rawImage);
// loop through each pixel's components
for (int byte = 0; byte < bytesPerRow*height; byte += 4) {
UInt8 r = data[byte];
UInt8 g = data[byte+1];
UInt8 b = data[byte+2];
// delta components
UInt8 dr = abs(r-source255Components[0]);
UInt8 dg = abs(g-source255Components[1]);
UInt8 db = abs(b-source255Components[2]);
// ratio of 'how far away' each component is from the source color
CGFloat ratio = (dr+dg+db)/(255.0*3.0);
if (ratio > maxTolerance) ratio = 1; // if ratio is too far away, set it to max.
if (ratio < minTolerance) ratio = 0; // if ratio isn't far enough away, set it to min.
// blend color components
data[byte] = (UInt8)round(ratio*r)+(UInt8)round((1.0-ratio)*destination255Components[0]);
data[byte+1] = (UInt8)round(ratio*g)+(UInt8)round((1.0-ratio)*destination255Components[1]);
data[byte+2] = (UInt8)round(ratio*b)+(UInt8)round((1.0-ratio)*destination255Components[2]);
}
// get image from context
CGImageRef img = CGBitmapContextCreateImage(ctx);
// clean up
CGContextRelease(ctx);
CGColorSpaceRelease(colorSpace);
free(data);
free(source255Components);
free(destination255Components);
UIImage* returnImage = [UIImage imageWithCGImage:img];
CGImageRelease(img);
return returnImage;
}
@end
用法:
UIImage* colaImage = [UIImage imageNamed:@"cola1.png"];
UIImage* blackColaImage = [colaImage imageByReplacingColor:[UIColor colorWithRed:1 green:0 blue:0 alpha:1] withMinTolerance:0.5 withMaxTolerance:0.6 withColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1]];
最小公差是像素开始与替换颜色混合(而不是被替换)的点。最大公差是像素停止混合的点。
之前:
之后:
结果是有点假,但请记住,您的原始图像相当小。这将更好地与更高分辨率的图像。你也可以利用公差来获得更好的结果!
问题内容: 所以我有一个带有火山的图像文件。其他所有内容均为0xFFFF00FF(不透明的洋红色)。我想将包含该颜色的每个像素替换为0(透明)。到目前为止,我的方法如下所示: 这工作正常,但似乎很慢。我见过有人以其他方式执行此操作,但是我不知道发生了什么。如果有人知道更好的方法,我非常想听听。 问题答案: 为了避免遍历像素,请更改基础ColorModel。这是一个例子。以下是作者使用原始Buffe
问题内容: 我想替换图像的颜色。例如,将所有蓝色变为红色而形状没有任何变形。当我尝试这样做时,我可以通过迭代每个像素来交换颜色,但是交换区域的形状变为平坦的形状。 example1输入:http: //www.tutorialwiz.com/tutorials/changing_color/images/original.jpg example1输出:http : //www.tutorialwi
我需要将不透明度的值设置为xml drawable中的颜色。但当我尝试添加两个不透明度值(#20C0C0C0)时,就不起作用了。颜色看起来完全透明。 这是我的代码。。。 有人有主意吗?谢谢你的帮助。
本文向大家介绍将three.js背景更改为透明或HTML中的另一种颜色,包括了将three.js背景更改为透明或HTML中的另一种颜色的使用技巧和注意事项,需要的朋友参考一下 如果要在three.js中使用透明背景,则需要在下面给出的代码中将alpha参数传递给WebGLRenderer构造函数- 但是,要设置背景色,
问题内容: 我一直在网上搜索此信息,但没有找到任何体面的帮助。 我有一个BufferedImage,已与ImageIO一起阅读。现在,我想使该图像中的某种颜色变为透明,然后将图像另存为PNG。 我知道出于明显的原因我不能仅仅“绘制”透明颜色,所以我猜我需要某种过滤器。 有人为此提供了一些示例代码吗? 问题答案: 我最近这样做是为了回答我的项目经理的问题。 将灰色转换为透明的功能是: 实际上,它作用
问题内容: 我一直在网上搜索此信息,但没有找到任何体面的帮助。 我有一个BufferedImage,已与ImageIO一起阅读。现在,我想使该图像中的某种颜色变为透明,然后将图像另存为PNG。 我知道出于明显的原因,我不能仅仅“绘制”透明颜色,所以我猜我需要某种过滤器。 有人为此提供了一些示例代码吗? 问题答案: 我最近这样做是为了回答我的项目经理的问题。 将灰色转换为透明的功能是: 实际上,它作