2009-01-20 5 views
8

Siguiendo las instrucciones en this question, tengo un código en ejecución para extraer iconos de archivos y mostrarlos en un conjunto de ListView en el modo de detalles. Quiero que los íconos se muestren a 16 x 16, pero cuando tengo el tamaño de la ImageList configurado, los íconos que salen se ven muy raros (no estoy seguro de cómo describirlo, vea la captura de pantalla adjunta).Obtener icono de 16 x 16 de calidad completa con Icon.ExtractAssociatedIcon e ImageList

He intentado cambiar el tamaño a 32 x 32 y salen bien, pero seguramente debe haber una manera de obtener buena calidad. Los iconos de 16 x 16 no deben estar ahí?

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

Respuesta

10

usted tiene que utilizar 2 listas de imágenes, una para smallimages y uno para largeimages para obtener el mejor resultado que pienso. (La vista de lista tiene dos propiedades, LargeImageList y SmallImageList)

Editar (nueva información que se encuentra que funcionaba cuando intenté):

Esta versión se utiliza la interpolación para obtener el pulgar más pequeño, debe ser mejor.

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") 
+1

Lamentablemente, eso no parece funcionar, todavía se muestran mal. ¿Alguna otra idea? – robintw

+0

Estoy trabajando en ello ...;) – Stefan

+0

Gracias. Intenté lo que sugeriste en tu edición, utilizando el método DrawImage y eso tampoco parece funcionar; da exactamente los mismos resultados. Puedo publicar el código que estoy usando con el método DrawImage si eso ayuda. – robintw

3

Con esta Code Project Article y la Demo of ExtractIconEx on PInvoke.net puede escribir lo siguiente:

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); 

usted tiene que cambiar la firma de ExtractIconFromExe a

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

y cambiar el código de un par de líneas más abajo a

if (large) 
    readIconCount = ExtractIconEx(file, nIconIndex, hIconEx, hDummy, 1); 
else 
    readIconCount = ExtractIconEx(file, nIconIndex, hDummy, hIconEx, 1); 
+0

¡Gracias @HumerGu, también pude beneficiarme de eso! –

1

Defaut Imagelist La propiedad ColorDepth está establecida en Depth8Bit, configúrelo en Depth32Bit.