10

私たちのアプリケーションは、OpenDocument ファイル形式 ( http://en.wikipedia.org/wiki/OpenDocumentを参照) に似たファイル形式を持っています。つまり、マニフェスト ファイル、サムネイル画像などを圧縮したものです。

OpenOffice ファイルには、Windows と Linux の両方で、アイコンとして Open Office ファイルのプレビュー イメージがあることに気付きました。私たちのファイルでこれを達成する方法はありますか?つまり、内部のthumbnail.pngに基づいた動的なアイコンが必要ですか?

編集 1うわー、すべての迅速な回答に感謝します。Thumbnailerは GNOME の世界にぴったりです。Windows 私はそれらのリンクを調べます、ありがとう。コメントの質問については、プログラムまたはインストーラーを介して。

編集 2ああ、Mac を忘れていました。Macではどうですか?(Mac 愛好家には申し訳ありません!) また、OpenOffice が IconHandler をどのように処理するかについてのリンクや情報はありますか?

4

9 に答える 9

8

ウィンドウズ

必要なのは、サムネイル ハンドラーとも呼ばれるアイコンハンドラーです。これは、アクティブな x コントロールとして書かれた例です。

もう 1 つのリソースは、Property Handlersを検索することです。これは、Windows で動的メタデータを正しく処理するための最新かつ最適な方法を示しているはずです。

これらは動的なソリューションです。すべてのファイルに関連付けられたアイコンが必要な場合は必要ありません。拡張子だけでなく、ファイルの内容に基づいて Windows エクスプローラーにアイコンを表示させたい場合にのみ使用されます。ファイルが変更されると、アイコンが更新されて変更が反映されます。ファイル自体の画像である必要はありません。サムネイル ハンドラーは、ファイルの内容に基づいて任意の画像を生成できます。

プロパティ ハンドラーは、曲やビデオの長さなど、他のメタデータを更新するため、Windows エクスプローラーがサポートするすべてのメタデータを使用できます。

MAC のサポートに関して、このページには、「Mac と Windows オペレーティング システムでは、このタイプのサムネイルを有効にする方法が異なります。Mac OS の場合、このサポートはバージョンごとに一貫していないため、追求されていません。 [Adobe InDesign の場合]."

OS X

Mac OSX のアイコンは、Launch Services Databaseによって決定されます。ただし、登録されたアプリケーションによって処理されるすべてのファイルの静的アイコン ファイルを参照します (拡張子に基づくものではありません。各ファイルには、それが属するアプリケーションを決定するメタ データが添付されていますが、拡張子はメタ データがない場合にヒントを提供します)。別の OS またはファイル システムからファイルを取得するなど)

OSX の動的アイコン機能は Finder によって提供されているようですが、検索ではこの方向への簡単な指針が得られません。Finder は時間の経過とともに変化し続けるため、このターゲットがヒットしにくい理由がわかります...

ノーム

Gnome の場合は、サムネラーを使用します。(おかげでドーワード)

これは非常に単純なプログラムで、次の 3 つのコマンド ライン引数があります。

  • 入力ファイル名、サムネイルで説明しているファイル (または代わりにそれらを受け入れる場合は URI)
  • PNGを書き込む必要がある出力ファイル名
  • サイズ、生成する必要がある最大正方形の画像サイズを表すピクセル単位の数値 (128 --> 128x128 以下)

すべてのシステムがこれほどシンプルであることを望みます。一方、これはアニメーションや、他のシステムで実装するのがより困難なプラグインによって提供される他のいくつかの機能をサポートしていません。

KDE

私は少し確信が持てませんが、開始するためのいくつかの指針があります。まず、Konqueror はファイル マネージャーであり、アイコンを表示するということです。Konqueror は、いくつかの組み込みタイプの動的アイコンをサポートしていますが、これらがハードコードされているのか、それともプラグインを作成できるのかはわかりません。開始点として、組み込みコンポーネントのチュートリアルを確認してください。

Plasma と呼ばれる新しい (らしい?) 機能 (または計画中の機能...) があり、アイコンとアイコン機能に大きく関係しています。この発表この初期実装を確認してください。

Konqueror のソースを掘り下げて、テキスト ファイルや既に実装されている他のファイルに対してどのようにこれを行ったかを確認する必要があるかもしれません。

-アダム

于 2008-09-23T13:27:22.663 に答える
4

バージョン 10.5 以降の Mac OSX …</h1>

… には 2 つのアプローチがあります。

  1. ドキュメントは標準の OSX バンドル形式で、静止画像があります 。これは、サブフォルダー QuickLook を作成し、Thumbnail/Preview.png/tiff/jpg を内部に配置することで実行できます。

  2. それ以外はすべて、/Library/QuickLook ~/Library/QuickLook または YourApp.app/Contents/Library/QuickLook フォルダー内に保存できる QuickLook ジェネレーター プラグインが必要です。

このジェネレーターは、その場でサムネイルと QuickLook プレビューを作成するために使用されています。XCode には、このためのテンプレートが用意されています。テンプレートは、実装する必要がある必要なANSI Cファイルを生成します。Object-Cコードを記述したい場合は、GenerateThumbnailForURL の名前を変更する必要があります。cおよび GeneratePreviewForURL. cを GenerateThumbnailForURL に変更します。mおよび GeneratePreviewForURL です。m (そして Apple Devel Docs を注意深く読んでください ;) )


シンプルな zip コンテナー ベースのデモ:

GenerateThumbnailForURL.c で、Cocoa.framework と Foundation.framework をプロジェクトに追加する必要があります (これは私の頭から離れている部分があるため、そのままで動作するという保証はありません ;) ):

#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

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 Plugin です。

于 2009-11-25T09:15:46.573 に答える
2

Windowsでは、必要なのはアイコンハンドラーを実装することです。私はこれを何ヶ月も前に行いましたが、COMの基本を知っている限り難しくはありません。

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

于 2008-09-23T13:21:20.027 に答える
1

Gnome の場合は、サムネラーを使用します

于 2008-09-23T13:12:16.100 に答える
0

「独自のカスタム」アイコンは、Windows では PE ファイルしか持てないと思います。ファイル拡張子の他のすべてのアイコンは、Windows レジストリに保存されます。

PE ファイルの仕様については、An In-Depth Look into the Win32 Portable Executable File FormatおよびPeering Inside the PE: A Tour of the Win32 Portable Executable File Format を参照してください。

他のOSでどのように機能するかはわかりません:/。

于 2008-09-23T13:14:25.020 に答える
0

Linux についてはわかりませんが、Windows の場合は、ここから開始できます: http://msdn.microsoft.com/en-us/library/bb774614.aspx

編集:このインターフェイスは、アイコンではなく、サムネイル ビューに表示されるサムネイル用だと思います。お時間を無駄にして申し訳ありません。

于 2008-09-23T13:19:17.973 に答える
0

これは、私が知る限り、オペレーティング システム次第であり、ファイル拡張子に基づいています。

于 2008-09-23T13:11:33.093 に答える
0

WINDOWSの場合、これを試してください:

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

于 2008-09-23T13:12:53.433 に答える
0

実行可能ファイルには、ファイル内に (場合によっては複数の) アイコンが「リソース」として表示されます。

データ ファイルは、ファイルの関連付けに基づいてアイコンを取得します。

ファイルごとにカスタムアイコンが必要な場合は、はるかに困難です。OSをだまして実行可能ファイルと認識させ、アイコンをリソースとしてファイルに埋め込むか、OSにディープリンクしてデフォルトのアイコン選択ルーチンをオーバーライドする必要があります。

于 2008-09-23T13:13:19.033 に答える