2011-10-02 3 views
5

Estoy usando WindowsAPICodePack, obteniendo la miniatura de ShellFile. Pero algunos de los que se parecen a los íconos genéricos, tienen un fondo negro. Por lo tanto, lo hago un mapa de bits y establezco el negro como transparente.Cómo eliminar el color de fondo de los "iconos" de ShellFile, pero no de las miniaturas "reales"

El problema es que cuando se trata de una miniatura de una imagen, no debería hacerlo. ¿Cómo puedo decir una miniatura real de un "icono"?

Mi código:

ShellFile sf = ShellFile.FromFilePath(path); 
Bitmap bm = sf.Thumbnail.MediumBitmap; 
bm.MakeTransparent(Color.Black); 

Gracias

+2

difícil ver cómo MakeTransparent puede funcionar bien en los iconos que contienen negro. De todos modos, use la propiedad FormatOption para pedir primero solo un ícono. Si eso falla, solicite una miniatura. –

+0

@Hans a) Gracias. Exactamente lo que estaba buscando. (pero primero pido una miniatura, siempre hay un ícono). b) ¿Hay alguna otra manera de deshacerse del color de fondo? Si no, supongo que siempre puedo obtener un ícono en lugar de un mapa de bits, ahora que sé que no va a ser una miniatura. – ispiro

Respuesta

3

Puede abordar este problema desde otro ángulo. Es posible forzar a ShellFile.Thumbnail a que solo extraiga la imagen en miniatura si existe o forzarla a extraer el icono de la aplicación asociada.

Así que su código sería algo como esto:

Bitmap bm; 
using (ShellFile shellFile = ShellFile.FromFilePath(filePath)) 
{ 
    ShellThumbnail thumbnail = shellFile.Thumbnail; 

    thumbnail.FormatOption = ShellThumbnailFormatOption.ThumbnailOnly; 

    try 
    { 
     bm = thumbnail.MediumBitmap; 
    } 
    catch // errors can occur with windows api calls so just skip 
    { 
     bm = null; 
    } 
    if (bm == null) 
    { 
     thumbnail.FormatOption = ShellThumbnailFormatOption.IconOnly; 
     bm = thumbnail.MediumBitmap; 
     // make icon transparent 
     bm.MakeTransparent(Color.Black); 
    } 
} 
+1

"pueden ocurrir errores con las llamadas a la API de Windows, así que simplemente omita" - ¿esta es una buena práctica? – BudBrot

+0

Puede capturar solo una COMException con HResult 0x8004B200 de la siguiente manera: 'catch (InvalidOperationException ex) { \t COMException comException = ex.GetBaseException() como COMException; \t if (comException.ErrorCode! = Desmarcado ((int) 0x8004B200)) \t \t throw; \t // TODO: Hacer algo } ' –

Cuestiones relacionadas