Как мне сделать так, чтобы файлы в моем собственном формате имели собственный динамический значок?

StackOverflow https://stackoverflow.com/questions/120865

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

Окна

Что вам нужно, это Обработчик значков, также известный как обработчик миниатюр.Вот пример, написанный как активное управление x.

Еще один ресурс — поискать Обработчики свойств, который также должен указать вам на новейший и лучший способ правильной обработки динамических метаданных в Windows.

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

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

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

ОС Х

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

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

Гном

Для Gnome вы используете миниатюрщик.(Спасибо Дорвард)

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

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

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

КДЕ

Я немного не уверен, но есть несколько советов, которые помогут вам начать.Во-первых, Konqueror является файловым менеджером и отображает значки. Он поддерживает динамические значки для некоторых встроенных типов, но я не знаю, жестко ли они запрограммированы или вы можете написать плагины.Проверьте Учебное пособие по встроенным компонентам для отправной точки.

Есть новая (почти?) функция (или запланированная функция...) под названием Plasma, которая во многом связана с иконками и их функциональностью.Проверить это объявление и эта первоначальная реализация.

Возможно, вам придется покопаться в исходном коде Konqueror и посмотреть, как они сделали это для текстовых файлов и других уже реализованных файлов.

-Адам

Другие советы

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 предлагает для этого шаблон.Шаблон генерирует необходимые АНСИ С файлы, которые необходимо реализовать.Если вы хотите написать Объект-С код, вам необходимо переименовать файл GenerateThumbnailForURL.с и Генератепревиевфорурл.с для создания ThumbnailForURL.м и Генератепревиевфорурл.м (и внимательно прочитайте документацию 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;
}

Инфо.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.Хорошая ссылка, которую я использовал здесь, - это Плагин QuickLook IPA из Googlecode

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

Видеть: http://msdn.microsoft.com/en-us/library/bb776857(VS.85).aspx

Для Gnome вы используете миниатюрщик.

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

для WINDOWS попробуйте следующее:

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

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

Файлам данных присваивается значок на основе ассоциации файлов.

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

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

Спецификацию PE-файла вы можете посмотреть на Углубленный анализ формата переносимых исполняемых файлов Win32 и Заглядывание внутрь PE:Обзор портативного формата исполняемых файлов Win32.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top