如何解决重新着色一组 PNG 图标
我有一组 .png 格式的图标。客户希望它们具有不同的颜色。我知道它们来自 glyphicons 或 fontawesome 图标字体,但我不知道它们是如何生成的。我试过这个命令来重新给它们上色,但总是留下一些红色,增加模糊值对图像的其他部分有负面影响:
mogrify -fuzz 41% -fill "#5DBFAD" -opaque "#ea5648" *icon.png *arrow.png *rtl.png
之前的图片:
注意:如果您有深色主题,请仔细查看,彩色主题上方还有第二个深灰色图标。
我需要一种方法来摆脱这些红色伪影,或者一种方法来使用我选择的颜色自行生成这些图标(在 css 中完全替换也是一种选择,使用图标字体,对其进行着色和动画)。同样出于未知原因,某些图标的顶部带有彩色图标,如下所示:
额外信息:当鼠标悬停在这些图标上时,会向上/向下转换几个像素以显示另一个图标。这是免费的 nopCommerce 主题的一部分:http://themes.nopaccelerate.com/themes/nopaccelerate-simplex-theme-3/?utm_source=nop&utm_medium=extension&utm_campaign=extension-directory
解决方法
您可以使用 ImageMagick 使用这样的命令为输入图像的下半部分重新着色...
magick input.png -crop 1x2@ ^
( +clone -fill "#5DBFAD" -colorize 100 ) -delete 1 -append result.png
这仅隔离了括号内的下半部分,并使用“-colorize”重新着色图像而不会留下伪影。然后它重新组装两半以完成图标。
不幸的是,“-clone”不是“mogrify”的可用选项,因此对于这样的命令,您只需要在命令外壳中使用“magick”和“for”循环来处理多个图像。
该命令采用 Windows 语法。对于 *nix 系统,将连续行插入符 "^" 更改为反斜杠 "\",并使用反斜杠 "\(...\)" 转义括号。
关于彩色部分在顶部而不是底部的图标,ImageMagick 可能可以确定哪一端是彩色的,但它可能会变得复杂。也许更容易手动对它们进行排序并将它们分成两组进行处理。要仅对上半部分着色,请在读取图像后添加“-rotate 180”,然后在写入结果之前再次添加“-rotate 180”。
,嗨,最好的方法是询问支持团队 当您使用 nopAccelerate 的主题时,您可以通过 support(at)nopaccelerate.com 直接联系他们,或前往 here 并与他们一起创建支持票。
,我最终编写了一个简单的程序来执行此操作,因此我在此处发布了源代码,但 @GeeMack 的答案似乎是一个更优雅的解决方案,因此我接受了它。
我的源代码: 程序.cs
using System;
using System.Drawing;
using System.IO;
namespace ColorReplacer
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"Supplied path: {args[0]},from color: {args[1]} to color: {args[2]}");
FileStream fs = new FileStream(args[0],FileMode.Open);
var image = new Bitmap(fs);
fs.Close();
for (var i = 0; i < image.Width; i++)
{
for (var j = 0; j < image.Height; j++)
{
var pixel = image.GetPixel(i,j);
if (pixel.R == ColorConverter.RfromHex(args[1]) && pixel.G == ColorConverter.GfromHex(args[1]) && pixel.B == ColorConverter.BfromHex(args[1]))
{
image.SetPixel(i,j,Color.FromArgb(pixel.A,ColorConverter.RfromHex(args[2]),ColorConverter.GfromHex(args[2]),ColorConverter.BfromHex(args[2])));
}
}
}
image.Save(args[0]);
}
}
}
ColorConverter.cs
using System.Globalization;
namespace ColorReplacer
{
public static class ColorConverter
{
public static int RfromHex(string color)
{
if (color.IndexOf('#') != -1)
color = color.Replace("#","");
return int.Parse(color.Substring(0,2),NumberStyles.AllowHexSpecifier);
}
public static int GfromHex(string color)
{
if (color.IndexOf('#') != -1)
color = color.Replace("#","");
return int.Parse(color.Substring(2,NumberStyles.AllowHexSpecifier);
}
public static int BfromHex(string color)
{
if (color.IndexOf('#') != -1)
color = color.Replace("#","");
return int.Parse(color.Substring(4,NumberStyles.AllowHexSpecifier);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。