Как вы можете получить доступ к значкам из файла Multi-Icon (.ico) с помощью индекса в С#

Я хочу использовать 4-е изображение из файла ico: C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\VS2008ImageLibrary\1033\VS2008ImageLibrary\VS2008ImageLibrary\Objects\ico_format\WinVista\Hard_Drive.ico

Если я вижу этот значок с помощью Windows Photo Viewer, он показывает мне 13 разных значков.

Я сбросил этот значок в файл ресурсов, как я могу получить нужный значок, используя index.


person Nitin Chaudhari    schedule 05.01.2012    source источник


Ответы (2)


В 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 );
}
person Stephan Bauer    schedule 05.01.2012

Вам потребуется вручную проанализировать файл .ico, извлекая информацию из заголовка (см. здесь для макета типа файла .ico).

На vbAccelerator есть проект с открытым исходным кодом (не беспокойтесь, это на самом деле код С#, а не VB), который использует API Win32 для извлечения значков из ресурсов (exe, dll и даже ico, что вы и хотите сделать). Вы можете либо использовать этот код, либо просмотреть его, чтобы понять, как это делается. Исходный код можно просмотреть здесь.

person Jason Down    schedule 05.01.2012