将PNG转换为高质量ICO

7
也许这是一个很容易解决的问题,但我还没有找到完美的解决方案。 我正在尝试使用C#将png转换为ico,并找到了以下问题:converting .PNG to .ICO in C/C#,其中提供了一种可行的解决方案,如下所示:
using (FileStream stream = File.OpenWrite(@"C:\temp\test.ico"))
{
    Bitmap bitmap = (Bitmap)Image.FromFile(@"c:\temp\test.png");
    Icon.FromHandle(bitmap.GetHicon()).Save(stream);
}

针对我的项目,我略微改变了这种方法:

string pngFile = "path/to/pngfile";
using (Bitmap bitmap = new Bitmap(pngFile))
{
   using (Icon icon = Icon.FromHandle(bitmap.GetHicon()))
   {
      using (MemoryStream stream = new MemoryStream())
      {
         icon.Save(stream);
         // something interesting with icon here
      }
   }
}

我遇到的问题是生成的ico质量很差,我猜测它被调整大小为16x16并丢失了一些颜色深度,可能只剩下16种颜色?如何将其转换为更高质量的ico文件?


你可以尝试使用:https://gist.github.com/darkfall/1656050。我可以告诉你,你需要比“GetHicon”更强大的东西,因为那只是一种快速而粗糙的方法,并不意味着是无损的。 - DonBoitnott
@DonBoitnott请将您的评论发布为答案。我使用了您的建议并成功使其工作,我相信这是正确的答案。 - Bazzz
3个回答

8
我相信你需要一种比 GetHIcon() 更强大的方法。这只是一种“快速而简单”的选项,并不是无损的。
以下是一个可以在转换为ICO时保留图像质量的类的示例:

https://gist.github.com/darkfall/1656050


脚本非常好用,但是如果我尝试生成高度大于255的图标,则会出现“算术运算导致溢出”错误。这可能是由于CBYTE()最大允许为255 - 您是否有任何解决方法/建议来使用您的代码制作高质量图标? - VarunC

3

2
在所提到的问题中,被接受的解决方案使用了ImageMagick,这是一个很棒的图像处理工具,可以让你在将PNG转换为ICO时控制大小、颜色深度等。我真的建议尝试那个解决方案。
使用ImageMagick实用程序大致如下:
convert -resize x16 -gravity center -crop 16x16+0+0 input.png \ -flatten -colors 256 output/favicon.ico
(然后你可以控制-resize和-colors来达到你想要的效果。)
在C#中,通过ImageMagick库http://imagemagick.codeplex.com应该也可以使用相同的选项。

抱歉在问题中没有提到,但如果可能的话,我希望不要依赖外部库。如果其他方法都失败了,我会考虑你的建议。 - Bazzz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接