如何获得自己的文件格式的文件以具有自己的动态图标?

时间:2020-03-06 14:35:50  来源:igfitidea点击:

我们的应用程序具有类似于OpenDocument文件格式的文件格式(请参阅http://en.wikipedia.org/wiki/OpenDocument),即以清单文件,缩略图等压缩。

我注意到在Windows和Linux中,OpenOffice文件都将Open Office文件的预览图像作为其图标。有什么方法可以为我们的文件完成此操作:即我想要基于内部thumbnail.png的动态图标吗?

编辑1哇,感谢所有快速解答。 Thumbnailer在GNOME领域看起来很棒。 Windows,我将研究这些链接,谢谢。至于评论问题:以编程方式或者通过我们的安装程序。

编辑2哦,忘了Mac。在Mac上呢? (对不起,Mac爱好者!)还有一些链接或者信息,说明OpenOffice如何处理他们的IconHandler东西,因为我们的东西非常相似吗?

解决方案

据我所知,这取决于操作系统,它将基于文件扩展名。

对于Gnome,请使用缩略图。

对于WINDOWS,请尝试以下操作:

http://www.easydesksoftware.com/news/news12.htm

可执行文件在文件中具有图标(可能多个)作为"资源"。

数据文件会根据文件关联选择一个图标。

如果要每个文件一个自定义图标要难得多。我们可能需要愚弄OS而不认为OS是可执行文件,并且将图标作为资源嵌入文件中,或者需要深入链接OS来覆盖默认的图标选择例程。

我认为,"自定义"图标只能在Windows中包含PE文件。文件扩展名的所有其他图标都存储在Windows注册表中。

对于PE文件的规范,我们可以深入了解Win32便携式可执行文件格式,并查看PE内部:Win32便携式可执行文件格式概览。

我不知道它在其他OS中是如何工作的:/。

我不了解Linux,但是对于Windows,我们可以从这里开始:
http://msdn.microsoft.com/zh-CN/library/bb774614.aspx

编辑:我认为该界面适用于缩略图视图中显示的缩略图,而不是图标。很抱歉浪费时间。

在Windows中,我们需要实现一个图标处理程序。我是在很多月以前做的,只要我们了解COM的基础知识就不难了。

请参阅:http://msdn.microsoft.com/en-us/library/bb776857(VS.85).aspx

视窗

我们需要的是一个图标处理程序,也称为缩略图处理程序。这是一个编写为活动x控件的示例。

另一个资源是查找属性处理程序,该属性处理程序还应指向我们提供在Windows中正确处理动态元数据的最新和最佳方法。

这些是动态解决方案,如果我们只希望将图标与所有文件相关联,则仅在希望Windows Explorer根据文件中的内容(不仅是扩展名)以及文件更改时显示图标时才使用它们。图标已更新以反映更改。它也不必是文件本身的图像,缩略图处理程序也可以基于文件内容生成任何图像。

属性处理程序会更新其他元数据,例如歌曲或者视频长度,因此我们可以使用Windows资源管理器支持的所有元数据。

关于MAC支持,该页面说:" Mac和Windows操作系统使用不同的方法来启用这种类型的缩略图,对于Mac OS,此支持在各个版本之间是不一致的,因此一直未寻求支持。 [用于Adobe InDesign]。"

OS X

Mac OSX的图标由启动服务数据库确定。但是,它是指注册应用程序处理的所有文件的静态图标文件(它并不基于扩展名,每个文件都添加有确定其所属应用程序的元数据,尽管扩展名会在元数据不存在时给出提示。 ,例如从其他操作系统或者文件系统获取文件)

似乎Finder提供了OSX中的动态图标功能,但是搜索并没有在这个方向上显示出任何简单的指针。由于Finder会随着时间不断变化,因此我可以理解为什么很难达到此目标...

侏儒

对于Gnome,请使用缩略图。 (感谢多沃德)

这是我们编写的非常简单的程序,具有3个命令行参数:

  • 输入文件名,即我们要描述的带有缩略图的文件(如果接受,则为URI)
  • 输出文件名,需要在其中写入PNG
  • 大小,以像素为单位的数字,它描述了我们应该产生的最大正方形图像大小(128-> 128x128或者更小)

我希望所有系统都这么简单。另一方面,它不支持动画以及其他系统上较难实现的插件所提供的其他一些功能。

KDE

我有点不确定,但是有一些提示可以入门。首先是Konqueror是文件管理器,并显示它支持某些内置类型的动态图标的图标,但是我不知道这些图标是否经过硬编码或者可以编写的插件。请查看《嵌入式组件教程》以获取起点。

有一个称为Plasma的新(ish?)功能(或者计划中的功能...),与图标和图标功能有很大关系。查看此公告和此初始实施。

我们可能需要挖掘Konqueror的来源,并检查他们是如何对文本文件和其他已实现的文件执行此操作的。

-亚当

有两种方法:

  • 文档为标准OSX捆绑格式,并且具有静态图像。这可以通过创建子文件夹QuickLook并将Thumbnail / Preview.png / tiff / jpg放入其中来完成。
  • 其他所有内容都需要一个QuickLook生成器插件,该插件可以存储在/ Library / QuickLook〜/ Library / QuickLook或者YourApp.app/Contents/Library/QuickLook文件夹内。

该生成器用于动态创建缩略图和QuickLook预览。 XCode为此提供了一个模板。该模板生成必须实现的所需ANSI C文件。如果要编写Object-C代码,则必须将GenerateThumbnailForURL.c和GeneratePreviewForURL.c重命名为GenerateThumbnailForURL.m和GeneratePreviewForURL.m(并仔细阅读Apple Devel Docs;))

基于zip容器的简单演示:

我们将必须将Cocoa.framework和Foundation.framework添加到项目中
在GenerateThumbnailForURL.c中(这部分超出了我的脑海,因此无法保证它可以直接使用;)):

#include <Cocoa/Cocoa.h>
#include <Foundation/Foundation.h>

OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize)
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  /* unzip the thumbnail and put it into an NSData object */
  // Create temporary path and writing handle for extraction
  NSString *tmpPath = [NSTemporaryDirectory() stringByAppendingFormat: [NSString stringWithFormat: @"%.0f.%@" , [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"png"]];
  [[NSFileManager defaultManager] createFileAtPath: tmpPath contents: [NSData alloc] attributes:nil];
  NSFileHandle *writingHandle = [NSFileHandle fileHandleForWritingAtPath: tmpPath];

  // Use task to unzip - create command: /usr/bin/unzip -p <pathToFile> <fileToExtract>
  NSTask *unzipTask = [[NSTask alloc] init];
  [unzipTask setLaunchPath: @"/usr/bin/unzip"];

  // -p -> output to StandardOut, added File to extract, nil to terminate Array
  [unzipTask setArguments: [NSArray arrayWithObjects: @"-p", [(NSURL *) url path], @"Thumbnails/thumbnail.png", nil]];

  // redirect standardOut to writingHandle
  [unzipTask setStandardOutput: writingHandle];

  // Unzip - run task
  [unzipTask launch];
  [unzipTask waitUntilExit];

  // Read Image Data and remove File
  NSData *thumbnailData = [NSData dataWithContentsOfFile: tmpPath];
  [[NSFileManager defaultManager] removeFileAtPath: tmpPath handler:nil];

  if ( thumbnailData == nil || [thumbnailData length] == 0 ) {
     // Nothing Found. Don't care.
     [pool release];
     return noErr;
  }

  // That is the Size our image should have - create a dictionary too
  CGSize size = CGSizeMake(256, 256);
  NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
      [NSNumber numberWithInt:size.width],kQLPreviewPropertyWidthKey,
      [NSNumber numberWithInt:size.height],kQLPreviewPropertyHeightKey,
      nil];

  // Get CGContext for Thumbnail
  CGContextRef CGContext = QLThumbnailRequestCreateContext(thumbnail, size, TRUE, (CFDictionaryRef)properties);
  if(CGContext) {
     NSGraphicsContext* context = [NSGraphicsContext graphicsContextWithGraphicsPort:(void *)CGContext flipped:size.width > size.height];
     if(context) {
        //These two lines of code are just good safe programming…
       [NSGraphicsContext saveGraphicsState];
       [NSGraphicsContext setCurrentContext:context];

       NSBitmapImageRep *thumbnailBitmap = [NSBitmapImageRep imageRepWithData:thumbnailData];
       [thumbnailBitmap draw];

       //This line sets the context back to what it was when we're done
       [NSGraphicsContext restoreGraphicsState];
    }

    // When we are done with our drawing code QLThumbnailRequestFlushContext() is called to flush the context
    QLThumbnailRequestFlushContext(thumbnail, CGContext);

    // Release the CGContext
    CFRelease(CGContext);
  }

  [pool release];
  return noErr;
}

信息清单

打开它时,我们也将不得不修改info.plist文件,该文件具有许多预设字段。它们中的大多数都是自解释的(或者不必更改),但是我必须添加以下结构(复制粘贴应该复制文本,进入plist编辑器,然后粘贴。):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
   <dict>
     <key>UTTypeConformsTo</key>
     <array>
       <string>com.pkware.zip-archive</string>
     </array>
     <key>UTTypeDescription</key>
     <string>i-net Crystal-Clear Report File</string>
     <key>UTTypeIconName</key>
     <string>generic</string>
     <key>UTTypeIdentifier</key>
     <string>com.company.product</string>
     <key>UTTypeReferenceURL</key>
     <string>http://your-url.com</string>
     <key>UTTypeTagSpecification</key>
     <dict>
       <key>public.filename-extension</key>
         <array>
           <string>$fileEXT$</string>
         </array>
     </dict>
  </dict>
</array>
</plist>

这将注册文件类型$ fileExt $,并告诉系统文件类型是zipy格式类型。我在这里使用的一个很好的参考是googlecode的QuickLook IPA插件