当前位置: 首页 > 编程语言 > C#

访问不存在的缩略图Share

时间:2023-04-10 21:09:36 C#

访问不存在的缩略图我创建了一个应用程序,它将显示您计算机上的文件列表。每当您单击列表中的任何项目时,它旁边的小PictureBox应该会显示相应文件的缩略图。我在Windows7上使用C#。为了获取缩略图,我再次发现了一个在不同问题中发布的方法。首先,我参考了WindowsAPI代码包。然后我使用以下代码:ShellFileshellFile=ShellFile.FromFilePath(fullPathToFile);myPictureBox.Image=shellFile.Thumbnail.LargeBitmap;这并不总是有效。有时显示的缩略图只是“默认应用程序”图标。我发现真正的缩略图只有在Windows之前为该文件生成缩略图并将其存储在缩略图缓存中时才会显示。这意味着我必须手动打开文件夹,等待Windows为每个文件生成缩略图,然后我的应用程序才能看到这些缩略图。我的程序如何强制Windows7在使用它们之前生成真实的缩略图?更新(由Li0liQ提供)可以通过添加FormatOption强制缩略图检索:ShellFileshellFile=ShellFile.FromFilePath(fullPathToFile);shellFile.Thumbnail.FormatOption=ShellThumbnailFormatOption.ThumbnailOnly;myPictureBox.Image=shellFile.Thumbnail.LargeBitmap;但是,如果缩略图还没有,我会得到一个异常:当前ShellObject没有有效的缩略图处理程序,或者为这个特定的shell对象提取缩略图时出现问题。—>System.Runtime.InteropServices.COMException:Classnotregistered(HRESULTexception:0x80040154(REGDB_E_CLASSNOTREG))请参阅如何在Windows资源管理器中刷新文件的缩略图?潜在线索的问题和代码片段。下面是一段提取缩略图位图的代码(仅适用于WindowsVista或更高版本)。它基于很酷的IShellItemImageFactory接口:staticvoidMain(string[]args){//你可以使用你的windows安装支持的任何类型的文件。字符串路径=@"c:tempwhatever.pdf";使用(Bitmapbmp=ExtractThumbnail(path,newSize(1024,1024),SIIGBF.SIIGBF_RESIZETOFIT)){bmp.Save("whatever.png",ImageFormat.Png);}}publicstaticBitmapExtractThumbnail(stringfilePath,Sizesize,SIIGBFflags){if(filePath==null)thrownewArgumentNullException("filePath");//TODO:您可能希望为不同类型的文件缓存工厂//因为这个简单的调用可能会触发一些重负载的地下操作IShellItemImageFactoryfactory;inthr=SHCreateItemFromParsingName(filePath,IntPtr.Zero,typeof(IShellItemImageFactory).GUID,outfactory);如果(hr!=0)抛出新的Win32Exception(hr);内部指针bmp;hr=factory.GetImage(大小,标志,输出bmp);如果(hr!=0)抛出新的Win32Exception(hr);返回Bitmap.FromHbitmap(bmp);}[Flags]公共枚举SIIGBF{SIIGBF_RESIZETOFIT=0x00000000,SIIGBF_BIGGERSIZEOK=0x00000001,SIIGBF_MEMORYONLY=0x00000002,SIIGBF_ICONONLY=0x00000004,SIIGBF_THUMBNAILONLY=0x00000008,SIIGBF_INCACHEONLY=0x00000010,SIIGBF_CROPTOSQUARE=??0x00000020,SIIGBF_WIDETHUMBNAILS=0x00000040,SIIGBF_ICONBACKGROUND=0x00000080,SIIGBF_SCALEUP=0x00000100,}[DllImport("shell32.dll",CharSet=CharSet.Unicode)]privatestaticexternintSHCreateItemFromParsingName(stringpath,IntPtrpbc,[MarshalAs(UnmanagedType.LPStruct)]Guidriid,outIShellItemImageFactoryfactory);[ComImport][InterfaceType(ComInterfaceType.InterfaceIsIUnknown)][Guid("bcc18b79-ba16-442f-80c4-8a59c30c463b")]privateinterfaceIShellItemImageFactory{[PreserveSig]intGetImage(Sizesize,SIIGBFflags,outIntPtrphbm);}附加说明:经过一番搜索,我在Sharepoint中找到了MicrosoftOfficeThumbnail它可能只适用于办公文档,但它可能是你想要的。由于示例使用C++和VB.Net,因此需要进行一些翻译。我的程序如何强制Windows7在使用它们之前生成真实的缩略图?来自Shell接口:IThumbnailCache接口(强调我的)ThumbnailCacheAPI旨在为应用程序提供一种统一的方法来检索和缓存缩略图。在WindowsXP中,缩略图缓存是在每个文件夹的基础上完成的,并且缓存在每个文件夹内的Thumbs.db文件中进行维护。虽然此方法提供了空间局部性,但它不支持跨文件夹的预览和查询。WindowsVista中的缩略图缓存通过提供全局缓存解决了这个缺点。要缓存缩略图,应用程序必须首先获取表示将为其获取缩略图的项目的IShellItem,然后将IShellItem传递给对IThumbnailCache::GetThumbnail的调用。如果IThumbnailCache::GetThumbnail的标志参数包含标志WTS_EXTRACT,并且缩略图尚未缓存,则缩略图将被提取并放入缓存。如果设置了WTS_FORCEEXTRACTION标志,则忽略缓存并始终获取新缩略图。有关传递给IThumbnailCache::GetThumbnail的标志的更多详细信息,请参阅主题IThumbnailCache::GetThumbnail。如果缩略图不在缓存中,缩略图将使用在操作系统中注册的IExtractImage或IThumbnailProvider的现有实现自动从源文件中提取。您的应用程序不必提供缩略图提取器的实现。因此,假设您的系统实现了PDF的IThumbnail提供程序:获取PDF的shell项。获取对shell缩略图缓存的引用。我们称之为thumbNailCache。调用thumbNailCache.GetThumbnail(shellItem,thumbNailpx,wtxFlagSet,outthumbNailBitmap);.文档说这将为您创建缩略图并在输出参数thumbNailBitmap中返回它。注意事项:我不知道您的代码包是否完全公开了IThumbnailCache,但如果公开了,这看起来非常简单。如果没有,您将不得不从shell32.dll导入它。还有一个IThumbnailProvider接口可能适合您,但请阅读社区评论。它看起来脆弱且难以使用。据我所知,您不能强制Windows7生成缩略图。但是,您可以使用代码自己创建它:Imageimage=Image.FromFile(fileName);ImagethumbNail=image.GetThumbnailImage(120,120,()=>false,IntPtr.Zero);thumbNail.Save(Path.ChangeExtension(fileName,"thumb"));http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx以上就是C#学习教程的全部内容:访问不存在的缩略图分享,如果有用给你和你需要了解更多的C#学习教程,希望你多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

猜你喜欢