Получите миниатюру любого файла, включая SolidWorks в Windows XP/Vista
Внутри каждой установленной ОС имеется множество встроенных ThumbnailProviders. Благодаря этим провайдерам Windows может показывать миниатюры многих файлов. Например, проводник Windows может отображать содержимое файлов *.jpg, но также и из файлов Solidworks *.sldprt (если установлен SolidWorks).
Но есть ли способ получить эти эскизы? Я пытался управлять этим с помощью Windows API CodecPack, но мне это удалось только в Windows 7.
ShellFile shellFile = ShellFile.FromFilePath(filePath);
Bitmap shellThumb = shellFile.Thumbnail.Bitmap;
Вопрос заключается в следующем: есть ли другой способ использовать Thumbnail любого файла с зарегистрированным поставщиком Thumbnail в Windows XP/Vista? Я действительно в отчаянии...
2 ответа
Есть несколько способов:
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();
}
Вы можете использовать неуправляемые методы оболочки Windows, чтобы получить эскиз
Но результаты далеко не идеальны.
- отладка очень сложная, неуточненные ошибки встречаются часто
- на целевом компьютере должен быть доступен определенный файл-ридер (например, pdf-ридер для pdf, он не пробовал в SolidWorks)
- может работать только в Windows
- проблема производительности
- миниатюры низкого качества (пробовал с pdf)