Получите высококачественный значок 16 x 16, используя Icon.ExtractAssociatedIcon и ImageList - PullRequest
8 голосов
/ 21 января 2009

Следуя указаниям на этот вопрос , у меня работает некоторый код для извлечения значков из файлов и их отображения в ListView в режиме подробностей. Я хочу, чтобы значки отображались в формате 16 x 16, но когда для меня установлен размер ImageList, значки, которые появляются, выглядят очень странно (не знаю, как это описать - см. Прикрепленный скриншот).

Я пытался изменить размер на 32 x 32, и они получаются хорошо, но, конечно, должен быть способ получить хорошее качество 16 x 16 иконок, не так ли?

http://img165.imageshack.us/img165/4446/badqualityiconscc4.png

Ответы [ 3 ]

10 голосов
/ 21 января 2009

Вы должны использовать 2 списка изображений, один для маленьких изображений и один для больших изображений, чтобы получить лучший результат, я думаю. (Список имеет два свойства, LargeImageList и SmallImageList)

Изменить (нашел новую информацию, которая работала, когда я пытался):

Эта версия использует интерполяцию, чтобы получить меньший большой палец, должно быть лучше.

    Dim BigIcon As Icon = Nothing
    BigIcon = Icon.ExtractAssociatedIcon("c:\zebra.zip")
    Dim largeimages As New ImageList
    Dim smallimages As New ImageList

    largeimages.Images.Add("1", BigIcon)

    'Fix a smaller version with interpolation
    Dim bm As New Bitmap(BigIcon.ToBitmap)
    Dim thumb As New Bitmap(16, 16)
    Dim g As Graphics = Graphics.FromImage(thumb)
    g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    g.DrawImage(bm, New Rectangle(0, 0, 16, 16), New Rectangle(0, 0, bm.Width, bm.Height), GraphicsUnit.Pixel)
    g.Dispose()
    bm.Dispose()
    smallimages.Images.Add("1", thumb)
    ListView1.SmallImageList = smallimages
    ListView1.LargeImageList = largeimages
    thumb.Dispose()
    ListView1.Items.Add("Test", "Test", "1")
4 голосов
/ 19 апреля 2010

С помощью этой статьи проекта кода и демонстрации ExtractIconEx на PInvoke.net вы можете написать следующее:

FileAssociationInfo info = new FileAssociationInfo(".docx");

ProgramAssociationInfo pai = new ProgramAssociationInfo(info.ProgID);
ProgramIcon ico = pai.DefaultIcon;
Icon icoLarge = Martin.Hyldahl.Examples.ExtractIconEx.ExtractIconExample.ExtractIconFromExe(ico.Path, ico.Index, false);

вы должны изменить подпись ExtractIconFromExe на

public static Icon ExtractIconFromExe(string file, int nIconIndex, bool large)

и измените код на несколько строк до

if (large)
   readIconCount = ExtractIconEx(file, nIconIndex, hIconEx, hDummy, 1);
else
   readIconCount = ExtractIconEx(file, nIconIndex, hDummy, hIconEx, 1);
0 голосов
/ 22 мая 2014

По умолчанию для свойства Imagelist ColorDepth установлено значение Depth8Bit, - для Depth32Bit .

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