独自のファイル形式のファイルに独自の動的アイコンを持たせるにはどうすればよいですか?
-
02-07-2019 - |
質問
私たちのアプリケーションのファイル形式は、OpenDocument ファイル形式に似ています (「 http://en.wikipedia.org/wiki/OpenDocument) - つまりマニフェスト ファイル、サムネイル画像などとともに圧縮されます。
Windows と Linux の両方で、OpenOffice ファイルのアイコンとして OpenOffice ファイルのプレビュー イメージが表示されていることに気付きました。ファイルに対してこれを実現する方法はありますか?つまり内部のthumbnail.pngに基づいた動的なアイコンが必要ですか?
編集1 わあ、素早い回答ありがとうございます。 サムネラー GNOME の世界に最適です。Windows それらのリンクを調べてみます、ありがとう。コメントの質問については、次のようになります。プログラム的に、またはインストーラー経由で。
編集2 あ、マック忘れてた。Macではどうですか?(Mac 愛好家の方、ごめんなさい!) また、OpenOffice が IconHandler をどのように実行するかについてのリンクや情報はありますか。私たちのものは非常に似ているのでしょうか?
解決
ウィンドウズ
必要なのは、 アイコンハンドラー, 、サムネイル ハンドラーとも呼ばれます。以下は次のように書かれた例です アクティブXコントロール.
別のリソースは検索することです プロパティハンドラー, これは、動的なメタデータを Windows で正しく処理するための最新かつ最良の方法も示しています。
これらは 動的 解決策 - すべてのファイルにアイコンを関連付けたいだけの場合は必要ありません。拡張子だけでなくファイルの内容に基づいて Windows エクスプローラーにアイコンを表示させたい場合、およびファイルが変更した場合にのみ使用されます。アイコンは変更を反映して更新されます。ファイル自体の画像である必要はなく、サムネイル ハンドラーはファイルの内容に基づいて任意の画像を生成できます。
プロパティ ハンドラーは曲やビデオの長さなどの他のメタデータを更新するため、Windows エクスプローラーがサポートするすべてのメタデータを使用できます。
MAC対応に関しては、 このページ 「Mac と Windows オペレーティング システムでは、このタイプのサムネイルを有効にする方法が異なります。Mac OS の場合、このサポートはバージョンごとに一貫性がないため、[Adobe InDesign では] 追求されていません。」 」
OS X
Mac OSX のアイコンは、 サービスデータベースの起動. 。ただし、これは、登録されたアプリケーションによって処理されるすべてのファイルの静的なアイコン ファイルを指します (拡張子に基づいていません。各ファイルには、そのファイルが属するアプリケーションを決定するメタ データが添付されていますが、メタ データが添付されていない場合、拡張子はヒントを示します)別の OS またはファイル システムからファイルを取得するなど)
OSX の動的アイコン機能は Finder によって提供されているようですが、検索してもこの方向への簡単な指針は見つかりません。Finder は時間の経過とともに変化し続けるため、このターゲットを攻撃するのが難しい理由がわかります...
ノーム
Gnome の場合は、 サムネール. 。(ありがとう ドーワード)
これは非常に単純なプログラムで、次の 3 つのコマンド ライン引数があります。
- 入力ファイル名、サムネイルで説明しているファイル (代わりにそれらを受け入れる場合は URI)
- PNG を書き込む必要がある出力ファイル名
- size は、生成する正方形の画像の最大サイズを表すピクセル単位の数値 (128 --> 128x128 以下)
すべてのシステムがこれほどシンプルであればいいのにと思います。一方、これはアニメーションや、他のシステムでは実装が難しいプラグインによって提供されるその他のいくつかの機能をサポートしていません。
KDE
少し不確かですが、始めるにあたっていくつかのヒントがあります。まず、Konqueror はファイル マネージャーであり、アイコンを表示します。Konqueror は一部の組み込みタイプの動的アイコンをサポートしていますが、これらがハードコードされているのか、それとも作成できるプラグインなのかはわかりません。をチェックしてください 組み込みコンポーネントのチュートリアル 出発点として。
Plasma と呼ばれる新しい (っぽい?) 機能 (または計画中の機能...) があり、これはアイコンとアイコンの機能に大きく関係しています。チェックアウト この発表 そして この初期実装.
Konqueror のソースを詳しく調べて、テキスト ファイルや既に実装されている他のファイルに対してどのようにこれを実行したかを確認する必要があるかもしれません。
-アダム
他のヒント
Mac OSX バージョン 10.5 以降…
…には 2 つのアプローチがあります。
ドキュメントは標準の OSX バンドル形式であり、静止画像が含まれていますこれを行うには、サブフォルダー QuickLook を作成し、その中に Thumbnail/Preview.png/tiff/jpg を配置します。
ほかのすべて /Library/QuickLook ~/Library/QuickLook または YourApp.app/Contents/Library/QuickLook フォルダー内に保存できる QuickLook ジェネレーター プラグインが必要です。
このジェネレーターは、サムネイルと QuickLook プレビューをオンザフライで作成するために使用されます。XCode はこのためのテンプレートを提供します。テンプレートは必要なものを生成します ANSI C 実装する必要があるファイル。書きたい場合は オブジェクト-C コードでは、GenerateThumbnailForURL の名前を変更する必要があります。c そしてGeneratePreviewForURL。c ThumbnailForURL を生成します。メートル そしてGeneratePreviewForURL。メートル (そして Apple 開発ドキュメントを注意深く読んでください ;))
シンプルな 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;
}
情報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 プラグイン
Windows では、アイコン ハンドラーを実装する必要があります。私はこれを何ヶ月も前にやったことがありますが、COM の基本を知っていれば、それほど難しいことではありません。
見る: http://msdn.microsoft.com/en-us/library/bb776857(VS.85).aspx
Gnome の場合は、 サムネール.
私の知る限り、これはオペレーティング システムによって決まりますが、ファイル拡張子に基づいて決まります。
Windowsの場合はこれを試してください:
実行可能ファイルには、ファイル内に「リソース」としてアイコンが含まれます (複数の可能性があります)。
データ ファイルは、ファイルの関連付けに基づいてアイコンを選択します。
ファイルごとにカスタム アイコンが必要な場合は、さらに困難になります。OS をだまして実行可能ファイルであると認識させ、アイコンをリソースとしてファイルに埋め込むか、OS にディープリンクしてデフォルトのアイコン選択ルーチンをオーバーライドする必要があります。
Windowsでは「カスタム独自」アイコンはPEファイルのみを持つことができると思います。ファイル拡張子のアイコンは 1 つおきに Windows レジストリに保存されます。
PE ファイルの仕様については、次を参照してください。 Win32 ポータブル実行可能ファイル形式の詳細な調査 そして PE 内部のピアリング:Win32 ポータブル実行可能ファイル形式のツアー.
他の OS でどのように動作するかはわかりません:/。
Linux についてはわかりませんが、Windows の場合はここから始めることができます。http://msdn.microsoft.com/en-us/library/bb774614.aspx
編集: このインターフェイスはアイコンではなく、サムネイル ビューに表示されるサムネイル用だと思います。時間を無駄にして申し訳ありません。