2012-08-09 16 views
7

Hay muchos ThumbnailProviders incorporados dentro de cada SO instalado. Debido a estos proveedores, Windows puede mostrar la miniatura de muchos archivos. Por ejemplo, Windows Explorer puede mostrar contenido de archivos * .jpg, pero también de archivos de Solidworks * .sldprt (si está instalado SolidWorks).Obtenga una miniatura de cualquier archivo, incluido SolidWorks en Windows XP/Vista

¿Pero hay alguna forma de obtener estas miniaturas? He tratado de manejar esto utilizando la API de Windows CodecPack, pero sólo tuvo éxito en Windows 7.

ShellFile shellFile = ShellFile.FromFilePath(filePath);     
Bitmap shellThumb = shellFile.Thumbnail.Bitmap; 

pregunta es: ¿Hay alguna otra forma utilizable para obtener Miniatura de cualquier archivo con el proveedor en miniatura registrada en Windows XP/¿Vista? Estoy realmente desesperada ...

Respuesta

-1

Puede utilizar métodos ventanas shell no administrados a la imagen

Here is the code (not a small one)

Pero los resultados están lejos de ser perfecto.

  • depuración es muy duro, error no especificado son comunes
  • tiene que haber lector de archivos específicos dotados de equipo de destino (por ejemplo, PDF-lector de archivos PDF, no lo probamos en SolidWorks)
  • puede trabajar sólo en Windows
  • problema de rendimiento
  • miniaturas de baja calidad (lo intentó con pdf)
5

Hay varias maneras:

1) Con la biblioteca OpenMCDF. El archivo de Solidworks es Compound document para acceder a su contenido: está analizando el archivo.

OpenFileDialog dialog = new OpenFileDialog();  
dialog.InitialDirectory = Application.StartupPath; 
if (dialog.ShowDialog() == DialogResult.OK) 
{ 
    string STORAGE_NAME = dialog.FileName.ToString(); 
    CompoundFile cf = new CompoundFile(STORAGE_NAME); 
    CFStream st = cf.RootStorage.GetStream("PreviewPNG"); 
    byte[] buffer = st.GetData(); 
    var ms = new MemoryStream(buffer.ToArray()); 
    pictureBox1.Image = Image.FromStream(ms); 
    } 

2) Con la biblioteca EModelView.dll que se agregará como control y se colocará en el formulario.

OpenFileDialog dialog = new OpenFileDialog(); 
     if (dialog.ShowDialog() == DialogResult.OK) 
     { 
      axEModelViewControl1.OpenDoc(dialog.FileName.ToString(), false, false, true, ""); 
     } 

3) Con la biblioteca SWExplorer (wpfPreviewFlowControl)

 OpenFileDialog dialog = new OpenFileDialog(); 
     if (dialog.ShowDialog() == DialogResult.OK) 
     { 
      string sDocFileName = dialog.FileName.ToString(); 
      wpfThumbnailCreator pvf; 
      pvf = new wpfThumbnailCreator(); 
      System.Drawing.Size size = new Size(); 
      size.Width = 200; 
      size.Height = 200; 
      pvf.DesiredSize = size; 
      System.Drawing.Bitmap pic = pvf.GetThumbNail(sDocFileName); 
      pictureBox1.Image = pic; 
     } 

3) Con la biblioteca Administrador de Documentos (SolidWorks.Interop.swdocumentmgr)

  OpenFileDialog dialog = new OpenFileDialog(); 
     if (dialog.ShowDialog() == DialogResult.OK) 
     { 
      string sDocFileName = dialog.FileName.ToString(); 
      SwDMClassFactory swClassFact = default(SwDMClassFactory); 
      SwDMApplication swDocMgr = default(SwDMApplication); 
      SwDMDocument swDoc = default(SwDMDocument); 
      SwDMConfigurationMgr swCfgMgr = default(SwDMConfigurationMgr); 
      string[] vCfgNameArr = null; 
      SwDMConfiguration7 swCfg = default(SwDMConfiguration7); 
      IPictureDisp pPreview = default(IPictureDisp); 
      SwDmDocumentType nDocType = 0; 
      SwDmDocumentOpenError nRetVal = 0; 
      SwDmPreviewError nRetVal2 = 0; 
      Image image = default(Image); 

      //Access to interface 
      swClassFact = new SwDMClassFactory(); 
      swDocMgr = (SwDMApplication)swClassFact.GetApplication("Post your code here"); 
      swDoc = (SwDMDocument)swDocMgr.GetDocument(sDocFileName, nDocType, false, out nRetVal); 
      Debug.Assert(SwDmDocumentOpenError.swDmDocumentOpenErrorNone == nRetVal); 
      swCfgMgr = swDoc.ConfigurationManager; 

      pathLabel.Text = "Path to file: " + swDoc.FullName; 
      configLabel.Text = "Active config: " + swCfgMgr.GetActiveConfigurationName(); 
      vCfgNameArr = (string[])swCfgMgr.GetConfigurationNames(); 

      foreach (string vCfgName in vCfgNameArr) 
      { 
       //get preview 
       swCfg = (SwDMConfiguration7)swCfgMgr.GetConfigurationByName(vCfgName); 
       pPreview = (IPictureDisp)swCfg.GetPreviewPNGBitmap(out nRetVal2); 
       image = Support.IPictureDispToImage(pPreview); 
       //insert to picturebox 
       pictureBox1.BackgroundImage = image; 
      } 
      swDoc.CloseDoc(); 
     } 
+0

El ejemplo openMCDF no funciona. Hay un elemento "Vista previa" pero .net me dice que no es una imagen ??? – jimconstable

+0

Señalé el ejemplo de solidworks, por lo que debería funcionar. Si obtiene una imagen para el archivo de SolidWorks, el nombre del miembro debe ser "PreviewPNG", no "Vista previa". – streamdown

+0

intentado openMCDF, no funcionó. Luego intenté swdocumentmgr. Después de tener dificultades para encontrar stdole y microsoft.visualbasic.compatibility dlls, no funcionó tan bien. Está fallando en "GetPreviewPNGBitmap" diciendo que la clase no tiene una licencia de uso. – AXMIM

Cuestiones relacionadas