微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重新着色一组 PNG 图标

如何解决重新着色一组 PNG 图标

我有一组 .png 格式的图标。客户希望它们具有不同的颜色。我知道它们来自 glyphicons 或 fontawesome 图标字体,但我不知道它们是如何生成的。我试过这个命令来重新给它们上色,但总是留下一些红色,增加模糊值对图像的其他部分有负面影响:

mogrify -fuzz 41% -fill "#5DBFAD" -opaque "#ea5648" *icon.png *arrow.png *rtl.png

之前的图片

Image before

之后的图像:

Image after

注意:如果您有深色主题,请仔细查看,彩色主题上方还有第二个深灰色图标。

我需要一种方法来摆脱这些红色伪影,或者一种方法来使用我选择的颜色自行生成这些图标(在 css 中完全替换也是一种选择,使用图标字体,对其进行着色和动画)。同样出于未知原因,某些图标的顶部带有彩色图标,如下所示:

Coloured icon on top

额外信息:当鼠标悬停在这些图标上时,会向上/向下转换几个像素以显示一个图标。这是免费的 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 举报,一经查实,本站将立刻删除。