Как вы можете получить доступ к значкам из файла Multi-Icon (.ico) с помощью индекса в C # - PullRequest
8 голосов
/ 05 января 2012

Я хочу использовать 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 различных значков.

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

Ответы [ 2 ]

7 голосов
/ 05 января 2012

В 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 голосов
/ 05 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...