如何在C#中使用索引访问多图标(.ico)文件中的图标

8
我想使用位于以下路径的ico文件中的第四个图像C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\VS2008ImageLibrary\1033\VS2008ImageLibrary\VS2008ImageLibrary\Objects\ico_format\WinVista\Hard_Drive.ico 如果我在Windows照片查看器中查看此图标,会显示13个不同的图标。
我已经将此ico文件转储到资源文件中,如何使用索引检索所需的图标。
2个回答

8
在WPF中,您可以像这样做:
Stream iconStream = new FileStream ( @"C:\yourfilename.ico", FileMode.Open );
IconBitmapDecoder decoder = new IconBitmapDecoder ( 
        iconStream, 
        BitmapCreateOptions.PreservePixelFormat, 
        BitmapCacheOption.None );

// loop through images inside the file
foreach ( var item in decoder.Frames )
{
  //Do whatever you want to do with the single images inside the file
  this.panel.Children.Add ( new Image () { Source = item } );
}

// or just get exactly the 4th image:
var frame = decoder.Frames[3];

// save file as PNG
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(frame);
using ( Stream saveStream = new FileStream ( @"C:\target.png", FileMode.Create ))
{
  encoder.Save( saveStream );
}

5
你需要手动解析.ico文件,从头部获取信息(有关.ico文件类型的布局,请参见here)。
在vbAccelerator上有一个开源project(不用担心,它实际上是c#代码,而不是VB),它使用Win32 API从资源中提取图标(exe、dll甚至是ico,这正是你要做的)。你可以使用该代码或浏览它以了解如何完成此操作。源代码可以在here中浏览。

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