59

我想让 Tree 图标用于本土应用程序。有谁知道如何将图像提取为 .icon 文件?我想要 16x16 和 32x32,或者我只是做一个屏幕截图。

4

12 回答 12

73

如果有人正在寻找简单的方法,只需使用 7zip 解压缩 shell32.dll 并查找文件夹 .src/ICON/

于 2016-06-14T01:41:03.913 回答
58

在 Visual Studio 中,选择“文件打开...”,然后选择“文件...”。然后选择 Shell32.dll。应打开文件夹树,您将在“图标”文件夹中找到图标。

要保存图标,您可以右键单击文件夹树中的图标并选择“导出”。

于 2008-08-12T03:32:20.590 回答
21

另一种选择是使用诸如ResourceHacker之类的工具。它处理的不仅仅是图标。干杯!

于 2008-08-12T04:17:42.120 回答
13

我需要从 shell32.dll 中提取图标 #238 并且不想下载 Visual Studio 或 Resourcehacker,所以我从 Technet 找到了几个 PowerShell 脚本(感谢 John Grenfell 和 # https://social.technet.microsoft。 com/Forums/windowsserver/en-US/16444c7a-ad61-44a7-8c6f-b8d619381a27/using-icons-in-powershell-scripts?forum=winserverpowershell)做了类似的事情并创建了一个新脚本(如下)以满足我的需要.

我输入的参数是(源 DLL 路径、目标图标文件名和 DLL 文件中的图标索引):

C:\Windows\System32\shell32.dll

C:\Temp\Restart.ico

238

我发现我需要的图标索引是#238,通过临时创建一个新的快捷方式(右键单击桌面并选择 New --> Shortcut 并输入 calc 并按 Enter 两次)。然后右键单击新的快捷方式并选择属性,然后单击快捷方式选项卡中的“更改图标”按钮。粘贴到路径 C:\Windows\System32\shell32.dll 并单击确定。找到您要使用的图标并计算出它的索引。注意:索引 #2 在 #1 下方,而不是在其右侧。图标索引 #5 在我的 Windows 7 x64 机器上位于第二列的顶部。

如果有人有更好的方法,可以类似地工作但获得更高质量的图标,那么我很想听听。谢谢,肖恩。

#Windows PowerShell Code###########################################################################
# http://gallery.technet.microsoft.com/scriptcenter/Icon-Exporter-e372fe70
#
# AUTHOR: John Grenfell
#
###########################################################################

<#
.SYNOPSIS
   Exports an ico and bmp file from a given source to a given destination
.Description
   You need to set the Source and Destination locations. First version of a script, I found other examples but all I wanted to do as grab and ico file from an exe but found getting a bmp useful. Others might find useful
   No error checking I'm afraid so make sure your source and destination locations exist!
.EXAMPLE
    .\Icon_Exporter.ps1
.Notes
        Version HISTORY:
        1.1 2012.03.8
#>
Param ( [parameter(Mandatory = $true)][string] $SourceEXEFilePath,
        [parameter(Mandatory = $true)][string] $TargetIconFilePath
)
CLS
#"shell32.dll" 238
If ($SourceEXEFilePath.ToLower().Contains(".dll")) {
    $IconIndexNo = Read-Host "Enter the icon index: "
    $Icon = [System.IconExtractor]::Extract($SourceEXEFilePath, $IconIndexNo, $true)    
} Else {
    [void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    $image = [System.Drawing.Icon]::ExtractAssociatedIcon("$($SourceEXEFilePath)").ToBitmap()
    $bitmap = new-object System.Drawing.Bitmap $image
    $bitmap.SetResolution(72,72)
    $icon = [System.Drawing.Icon]::FromHandle($bitmap.GetHicon())
}
$stream = [System.IO.File]::OpenWrite("$($TargetIconFilePath)")
$icon.save($stream)
$stream.close()
Write-Host "Icon file can be found at $TargetIconFilePath"
于 2015-01-22T14:22:48.120 回答
6

Resources Extract是另一种工具,它可以递归地从大量 DLL 中查找图标,非常方便 IMO。

于 2013-04-06T19:51:18.683 回答
4

只需使用 IrfanView 打开 DLL 并将结果保存为 .gif 或 .jpg。

我知道这个问题很老,但它是“从 dll 中提取图标”的第二次谷歌点击,我想避免在我的工作站上安装任何东西,我记得我使用 IrfanView。

于 2014-05-22T14:31:59.723 回答
2

您可以下载免费软件Resource Hacker,然后按照以下说明进行操作:

  1. 打开您希望从中查找图标的任何 dll 文件。
  2. 浏览文件夹以查找特定图标。
  3. 从菜单栏中,选择“操作”,然后选择“保存”。
  4. 为 .ico 文件选择目标。

参考:http ://techsultan.com/how-to-extract-icons-from-windows-7/

于 2014-11-12T13:12:38.847 回答
2

这是上述解决方案的更新版本。我添加了一个隐藏在链接中的缺失程序集。新手不会理解的。这是示例将无需修改即可运行。

    <#
.SYNOPSIS
    Exports an ico and bmp file from a given source to a given destination
.Description
    You need to set the Source and Destination locations. First version of a script, I found other examples 
    but all I wanted to do as grab and ico file from an exe but found getting a bmp useful. Others might find useful
.EXAMPLE
    This will run but will nag you for input
    .\Icon_Exporter.ps1
.EXAMPLE
    this will default to shell32.dll automatically for -SourceEXEFilePath
    .\Icon_Exporter.ps1 -TargetIconFilePath 'C:\temp\Myicon.ico' -IconIndexNo 238
.EXAMPLE
    This will give you a green tree icon (press F5 for windows to refresh Windows explorer)
    .\Icon_Exporter.ps1 -SourceEXEFilePath 'C:/Windows/system32/shell32.dll' -TargetIconFilePath 'C:\temp\Myicon.ico' -IconIndexNo 41

.Notes
    Based on http://stackoverflow.com/questions/8435/how-do-you-get-the-icons-out-of-shell32-dll Version 1.1 2012.03.8
    New version: Version 1.2 2015.11.20 (Added missing custom assembly and some error checking for novices)
#>
Param ( 
    [parameter(Mandatory = $true)]
    [string] $SourceEXEFilePath = 'C:/Windows/system32/shell32.dll',
    [parameter(Mandatory = $true)]
    [string] $TargetIconFilePath,
    [parameter(Mandatory = $False)]
    [Int32]$IconIndexNo = 0
)

#https://social.technet.microsoft.com/Forums/windowsserver/en-US/16444c7a-ad61-44a7-8c6f-b8d619381a27/using-icons-in-powershell-scripts?forum=winserverpowershell
$code = @"
using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace System
{
    public class IconExtractor
    {

     public static Icon Extract(string file, int number, bool largeIcon)
     {
      IntPtr large;
      IntPtr small;
      ExtractIconEx(file, number, out large, out small, 1);
      try
      {
       return Icon.FromHandle(largeIcon ? large : small);
      }
      catch
      {
       return null;
      }

     }
     [DllImport("Shell32.dll", EntryPoint = "ExtractIconExW", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
     private static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);

    }
}
"@

If  (-not (Test-path -Path $SourceEXEFilePath -ErrorAction SilentlyContinue ) ) {
    Throw "Source file [$SourceEXEFilePath] does not exist!"
}

[String]$TargetIconFilefolder = [System.IO.Path]::GetDirectoryName($TargetIconFilePath) 
If  (-not (Test-path -Path $TargetIconFilefolder -ErrorAction SilentlyContinue ) ) {
    Throw "Target folder [$TargetIconFilefolder] does not exist!"
}

Try {
    If ($SourceEXEFilePath.ToLower().Contains(".dll")) {
        Add-Type -TypeDefinition $code -ReferencedAssemblies System.Drawing
        $form = New-Object System.Windows.Forms.Form
        $Icon = [System.IconExtractor]::Extract($SourceEXEFilePath, $IconIndexNo, $true)    
    } Else {
        [void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")
        [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
        $image = [System.Drawing.Icon]::ExtractAssociatedIcon("$($SourceEXEFilePath)").ToBitmap()
        $bitmap = new-object System.Drawing.Bitmap $image
        $bitmap.SetResolution(72,72)
        $icon = [System.Drawing.Icon]::FromHandle($bitmap.GetHicon())
    }
} Catch {
    Throw "Error extracting ICO file"
}

Try {
    $stream = [System.IO.File]::OpenWrite("$($TargetIconFilePath)")
    $icon.save($stream)
    $stream.close()
} Catch {
    Throw "Error saving ICO file [$TargetIconFilePath]"
}
Write-Host "Icon file can be found at [$TargetIconFilePath]"
于 2015-11-20T19:56:16.760 回答
2

还有一个可用的资源,即 Visual Studio 图像库,“可用于创建在视觉上与 Microsoft 软件一致的应用程序”,大概受底部给出的许可限制。 https://www.microsoft.com/en-ca/download/details.aspx?id=35825

于 2017-03-22T22:05:24.047 回答
2

这个问题在这里已经有了答案,但是对于任何想知道如何做到这一点的新人,我使用 7Zip 并导航到%SystemRoot%\system32\SHELL32.dll\.rsrc\ICON,然后将所有文件复制到所需的位置。

如果您想要预解压目录,可以在此处下载 ZIP

注意:我在 Windows 8.1 安装中提取了这些文件,因此它们可能与其他 Windows 版本上的不同。

于 2021-05-08T09:25:15.310 回答
1

如果您使用的是 Linux,则可以使用gExtractWinIcons从 Windows DLL 中提取图标。它在包中的 Ubuntu 和 Debian 中可用gextractwinicons

这篇博文有截图和简要说明

于 2014-07-23T08:43:49.740 回答
0

不确定我是否 100% 正确,但根据我的测试,上述使用 7Zip 或 VS 的选项不适用于 Windows 10 / 11 版本的 imageres.dll 或 shell32.dll。这是我看到的内容:

[shell32.dll]
.rsrc\MANIFEST\124
.rsrc\MUI\1
.rsrc\TYPELIB\1
.rsrc\version.txt
.data
.didat
.pdata
.rdata
.reloc
.text
CERTIFICATE

更新:我想我找到了原因。链接到我找到的一篇文章。(对不起,域外)。您可以在以下位置的文件中找到资源:

"C:\Windows\SystemResources\shell32.dll.mun"
"C:\Windows\SystemResources\imageres.dll.mun"

Windows 10 1903 中的 imageres.dll 中不再存在图标 - 4kb 文件 (superuser.com)

于 2022-02-21T03:24:52.403 回答