7

インストールされているすべての OS 内には、多数の ThumbnailProvider が組み込まれています。これらのプロバイダーにより、Windows は多くのファイルのサムネイルを表示できます。たとえば、Windows Explorer は *.jpg ファイルのコンテンツを表示できますが、Solidworks の *.sldprt ファイルも表示できます (SolidWorks がインストールされている場合)。

しかし、これらのサムネイルを取得する方法はありますか? Windows API CodecPack を使用してこれを管理しようとしましたが、Windows 7 でしか成功しませんでした。

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

質問: Windows XP/Vista で登録済みのサムネイル プロバイダーを使用して任意のファイルのサムネイルを取得する他の使用可能な方法はありますか? 本当に絶望的です...

4

2 に答える 2

5

いくつかの方法があります:

1) ライブラリOpenMCDF を使用。Solidworks ファイルは複合ドキュメントであるため、そのコンテンツへのアクセス - ファイルを解析しています。

 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) ライブラリ EModelView.dll をコントロールとして追加し、フォームに配置します。

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

3) 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) ライブラリ Document Manager (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();
        }
于 2013-01-18T13:14:41.900 に答える
-1

管理されていない Windows シェル メソッドを使用して、サムネイルを取得できます。

これがコードです(小さなものではありません)

しかし、結果は完璧とはほど遠いものです。

  • デバッグは非常に難しく、未特定のエラーはよくあることです
  • ターゲット マシンで使用できる特定のファイル リーダーが必要です (たとえば、pdf 用の pdf-reader、SolidWorks では試していません)。
  • Windowsでのみ動作可能
  • パフォーマンスの問題
  • サムネイルの品質が低い(pdfで試した)
于 2013-01-07T19:42:36.963 に答える