将图标文件保存到硬盘

11

我知道这一定非常简单 - 在VB6中,这个问题是多么的简单,但很难想象我花了多长时间在搜索答案。 我只是想使用Icon.ExtractAssociatedIcon从一个EXE文件中提取图标,然后将此图标文件保存到我的硬盘中。

所以,这是我的代码,我也会展示我尝试过的内容,这样您就不会认为我很懒。

OpenFileDialog ofd = new OpenFileDialog();
ofd.ShowDialog();

string s = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\IconData.ico";

Icon ico = Icon.ExtractAssociatedIcon(ofd.FileName);
Bitmap bmp = ico.ToBitmap();

bmp.Save(s, System.Drawing.Imaging.ImageFormat.Icon);

上述代码只是在我的桌面上创建了一个名为“IconData.ico”的文件,其长度为0字节。再次说明,我确信这一定非常容易做到,但我无论如何也想不出来。

谢谢!


你应该分享可执行文件或者你试图打开的图标,因为在这里它可以正常工作。 - Oscar Mederos
我将原始图标文件的名称从9665.ico更改为FileIcon.ico。新文件“ IconData.ico”在我的桌面上显示为空白白色图标,但是当我在画图中打开它时,可以看到图像。这正常吗? - user725913
这个 Stack Overflow 的帖子有一个链接指向 CodeProject 库,看起来很有前途。你可能想要去看看。 - Nick Spreitzer
1
“所以我们不认为你是懒惰的?”一个懒惰的程序员实际上是一件好事。这会激励我们寻找更简单的方法来完成任务,而这正是我们这个行业所追求的。 - Gichamba
你的设置肯定有问题。你的代码没有任何问题。 - Gichamba
1个回答

13

如果你在将图标转换为位图之前先保存图标,你将会得到更好的结果。这是因为“图标”可以包含多个尺寸,而位图是在转换期间选择的单一尺寸。

Icon类没有保存到文件的方法,但它确实有保存到FileStream的方法,所以你可以这样保存:

        string s = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\IconData.ico";
        using (FileStream fs = new FileStream(s, FileMode.Create))
            ico.Save(fs);

1
这也是我的第一反应,但当我尝试时,保存的图标没有显示正确。这是结果。 我使用了excel.exe作为目标程序集。 - Nick Spreitzer
1
谢谢,这就是我一直在使用的。我忘记更新这篇文章,因为距离我第一次找到解决方案还不到8个小时,所以我不能发布我的答案。但是,我会将其标记为正确答案。 - user725913
3
以lync.exe(skype)为例,我使用它时出现了非常模糊和像素化的结果。这是否可以预期,或者是我做错了什么? - xandermonkey

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