Как мне получить файлы в моем собственном формате, чтобы иметь собственный динамический значок? - PullRequest
9 голосов
/ 23 сентября 2008

Наше приложение имеет формат файла, аналогичный формату файла OpenDocument (см. http://en.wikipedia.org/wiki/OpenDocument) - т.е. упакован с файлом манифеста, миниатюрой изображения и т. Д.

Я заметил, что файлы OpenOffice имеют изображение предварительного просмотра файла Open Office в виде значков, как в Windows, так и в Linux. Есть ли способ сделать это для наших файлов: я хочу динамический значок, основанный на внутреннем thumbnail.png?

Редактировать 1 Ух, спасибо за все быстрые ответы. Thumbnailer отлично смотрится в мире GNOME. Windows Я посмотрю на эти ссылки, спасибо. Что касается вопроса с комментариями: программно ИЛИ через наш установщик.

Редактировать 2 О, забыл Mac. Как насчет Mac? (Извините, любители Mac!) Также есть какие-нибудь ссылки или информация о том, как OpenOffice выполняет свою работу с IconHandler - поскольку наши будут очень похожи?

Ответы [ 9 ]

8 голосов
/ 23 сентября 2008

Windows

Вам нужен Icon Handler , также известный как Thumbnail Handler. Вот пример, написанный как активный элемент управления x .

Другим ресурсом является поиск Обработчиков свойств , который также должен указывать на новейший и лучший способ правильной обработки динамических метаданных в окнах.

Это динамические решения - они не нужны, если вы просто хотите, чтобы значок ассоциировался со всеми вашими файлами, - они используются только тогда, когда вы хотите, чтобы проводник Windows отображал значок в зависимости от содержимого файла. , а не только расширение, а при изменении файла значок обновляется, чтобы отразить изменения. Это не обязательно должно быть изображение самого файла, обработчик миниатюр может генерировать любое изображение на основе содержимого файла.

Обработчик свойств обновляет другие метаданные, например длину песни или видео, поэтому вы можете использовать все метаданные, которые поддерживает Проводник Windows.

Что касается поддержки MAC, на этой странице говорится: «В операционных системах Mac и Windows существуют разные способы включения этого типа миниатюр, а в случае Mac OS эта поддержка несовместима с версией до версии, чтобы она не использовалась [для Adobe InDesign]. "

OS X

Значки для Mac OSX определяются Launch Services Database . Однако это относится к файлу статических значков для всех файлов, обрабатываемых зарегистрированным приложением (он не основан на расширении - к каждому файлу прикреплены метаданные, которые определяют приложение, к которому он принадлежит, хотя расширения дают подсказки, когда метаданные этого не делают. существует, например, получение файла из другой ОС или файловой системы)

Похоже, что функциональность динамических значков в OSX предоставляется Finder, но поиск не дает никаких простых указателей в этом направлении. Поскольку Finder со временем меняется, я понимаю, почему эту цель трудно поразить ...

Гном

Для Gnome вы используете thumbnailer . (спасибо Дорвард )

Это чрезвычайно простая программа, которую вы пишете, которая имеет 3 аргумента командной строки:

  • имя входного файла, файл, который вы описываете с помощью миниатюры (или URI, если вы принимаете их вместо)
  • имя выходного файла, в который нужно записать PNG
  • размер, число в пикселях, которое описывает максимальный квадратный размер изображения, которое вы должны создать (128 -> 128x128 или меньше)

Хотелось бы, чтобы все системы были такими простыми. С другой стороны, это не поддерживает анимацию и некоторые другие функции, которые предоставляют более сложные для реализации плагины в других системах.

KDE * * тысяча пятьдесят один Я немного не уверен, но есть несколько указателей, которые помогут вам начать. Во-первых, Konqueror является файловым менеджером и отображает значки - он поддерживает динамические значки для некоторых встроенных типов, но я не знаю, являются ли они жестко закодированными или плагинами, которые вы можете написать. Обратитесь к Руководству по встроенным компонентам , чтобы узнать, как начать. Существует новая (или?) Функция (или плановая функция ...) под названием Plasma, которая имеет много общего с иконками и иконками. Посмотрите это объявление и это начальная реализация . Возможно, вам придется покопаться в исходном коде Konqueror и проверить, как они это сделали для текстовых файлов и других уже реализованных. -Adam

4 голосов
/ 25 ноября 2009

Mac OSX начиная с версии 10.5…

… имеет два подхода:

  1. Ваш документ в стандартном формате пакета OSX и имеет статическое изображение Это можно сделать, создав подпапку QuickLook и поместив Thumbnail / Preview.png / tiff / jpg внутри.

  2. Все остальное требуется подключаемый модуль генератора 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;))


Демонстрация простого 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

Вам также придется изменить свой файл info.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. Хорошая ссылка, которую я использовал здесь - это QuickLook IPA Plugin от googlecode

2 голосов
/ 23 сентября 2008

В Windows вам нужно реализовать обработчик значков. Я сделал это много месяцев назад, и это не сложно, если вы знаете основы COM.

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

1 голос
/ 23 сентября 2008

Для Gnome вы используете thumbnailer .

0 голосов
/ 23 сентября 2008

Я не знаю о Linux, но для Windows вы можете начать здесь: http://msdn.microsoft.com/en-us/library/bb774614.aspx

Редактировать: Я думаю, что этот интерфейс предназначен для миниатюр, отображаемых в виде миниатюр, а не значков. Извините, что потратил ваше время.

0 голосов
/ 23 сентября 2008

Я думаю, что иконка "custom own" может иметь только файлы PE в Windows. Все остальные значки для расширений файлов хранятся в реестре Windows.

Для уточнения PE-файла вы можете посмотреть Углубленный анализ формата исполняемых файлов Win32 и Пиринг внутри PE: обзор формата исполняемых файлов Win32 .

Как это работает в других ОС, я не знаю: /.

0 голосов
/ 23 сентября 2008

Исполняемые файлы имеют значок внутри файла (возможно, несколько) в качестве «ресурса».

Файлы данных выбирают значок, основанный на ассоциации файлов.

Если вы хотите, чтобы для каждого файла была более сложная иконка. Вам либо нужно слишком обмануть операционную систему, чтобы думать, что она является исполняемым файлом, и встраивать значок в качестве ресурса в файл, либо использовать глубокую ссылку в ОС, чтобы переопределить стандартную процедуру выбора значков.

0 голосов
/ 23 сентября 2008

для WINDOWS попробуйте это:

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

0 голосов
/ 23 сентября 2008

Это зависит от операционной системы, насколько я знаю, это будет основано на расширении файла.

...