Comment obtenir des fichiers dans mon propre format de fichier pour qu'ils aient leur propre icône dynamique?

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

  •  02-07-2019
  •  | 
  •  

Question

Notre application a un format de fichier similaire au format de fichier OpenDocument (voir http: //en.wikipedia. org / wiki / OpenDocument ) - c'est-à-dire compressé avec un fichier manifeste, une vignette, etc.

Je remarque que les fichiers OpenOffice ont une image d’aperçu du fichier Open Office comme icônes, à la fois sous Windows et sous Linux. Existe-t-il un moyen d’y parvenir pour nos fichiers: c’est-à-dire que je souhaite une icône dynamique basée sur le fichier interne thumbnail.png?

Modifier 1 Wow, merci pour toutes les réponses rapides. Thumbnailer est très bien pour le monde GNOME. Windows Je vais examiner ces liens, merci. En ce qui concerne la question de commentaire: par programme OU via notre programme d’installation.

Modifier 2 Oh, j'ai oublié Mac. Et sur le Mac? (Désolé pour les passionnés de Mac!) Existe-t-il également des liens ou des informations sur la façon dont OpenOffice traite leurs éléments IconHandler - les nôtres étant très similaires?

Était-ce utile?

La solution

Windows

Ce dont vous avez besoin est un Gestionnaire d'icônes , également appelé gestionnaire de vignettes. Voici un exemple écrit en tant que contrôle x actif .

Une autre ressource consiste à rechercher Property Handlers , qui devrait également vous indiquer la manière la plus récente et la plus efficace de gérer correctement les métadonnées dynamiques dans Windows.

Ce sont des solutions dynamiques - elles ne sont pas nécessaires si vous souhaitez simplement associer une icône à tous vos fichiers - elles ne sont utilisées que lorsque vous souhaitez que l'explorateur Windows affiche une icône basée sur le contenu du dossier. fichier, pas seulement l'extension, et lorsque le fichier est modifié, l'icône est mise à jour pour refléter les modifications. Il ne doit pas nécessairement s'agir d'une image du fichier lui-même. Le gestionnaire de vignettes peut générer n'importe quelle image en fonction du contenu du fichier.

Le gestionnaire de propriétés met à jour d'autres métadonnées, telles que la longueur du morceau ou de la vidéo, afin que vous puissiez utiliser toutes les métadonnées prises en charge par Windows Explorer.

En ce qui concerne le support MAC, cette page indique: & Les systèmes d’exploitation Mac et Windows utilisent différentes méthodes pour activer ce type de vignette et, dans le cas du Mac OS, cette prise en charge a été incohérente d’une version à l’autre et n’a donc pas été poursuivie [pour Adobe InDesign]. < !> quot;

OS X

Les icônes pour Mac OSX sont déterminées par les Lancer la base de données . Cependant, il fait référence à un fichier d'icônes statique pour tous les fichiers gérés par une application enregistrée (ce n'est pas basé sur une extension - chaque fichier contient des métadonnées attachées qui déterminent l'application à laquelle il appartient, bien que les extensions donnent des indications lorsque les métadonnées ne sont pas compatibles. existe, comme obtenir le fichier à partir d’un système d’exploitation ou d’un système de fichiers différent)

Il semble que la fonctionnalité des icônes dynamiques dans OSX soit fournie par le Finder, mais les recherches n'apportent aucun indicateur facile dans cette direction. Comme le Finder ne cesse de changer au fil du temps, je comprends pourquoi cet objectif est difficile à atteindre ...

Gnome

Pour Gnome, vous utilisez un vignette . (merci Dorward )

C’est un programme extrêmement simple que vous écrivez, qui a 3 arguments en ligne de commande:

  • nom du fichier d'entrée, le fichier que vous décrivez avec la vignette (ou l'URI si vous les acceptez)
  • nom du fichier de sortie, où vous devez écrire le fichier PNG
  • taille, nombre, en pixels, décrivant la taille maximale d'image carrée à produire (128 - > 128x128 ou moins)

Je souhaite que tous les systèmes soient aussi simples. En revanche, cela ne prend pas en charge l'animation et quelques autres fonctionnalités fournies par des plugins plus difficiles à implémenter sur d'autres systèmes.

KDE

Je suis un peu incertain, mais il y a quelques indications qui devraient vous aider à démarrer. Tout d'abord, Konqueror est le gestionnaire de fichiers et affiche les icônes. Il prend en charge les icônes dynamiques pour certains types intégrés, mais je ne sais pas si elles sont codées en dur ou si des plug-ins peuvent être écrits. Consultez le Didacticiel sur les composants incorporés pour un point de départ.

Il existe une nouvelle fonctionnalité (ish?)fonction ed ...) appelée Plasma qui a beaucoup à voir avec les icônes et leur fonctionnalité. Découvrez cette annonce et cette implémentation initiale .

Vous devrez peut-être explorer la source de Konqueror et voir comment ils l'ont fait pour les fichiers texte et autres déjà mis en œuvre.

-Adam

Autres conseils

Mac OSX depuis la version 10.5 & # 8230;

& # 8230; a deux approches:

  1. Votre document est au format de lot OSX standard et possède une image statique . Cela peut être fait en créant un sous-dossier QuickLook et en plaçant le Thumbnail / Preview.png / tiff / jpg à l'intérieur.

  2. Tout le reste nécessite un plug-in de générateur QuickLook pouvant être stocké dans / Dossiers / Library / QuickLook ~ / Library / QuickLook ou à l'intérieur des dossiers YourApp.app/Contents/Library/QuickLook. <

Ce générateur est utilisé pour créer des vignettes et des aperçus QuickLook à la volée. XCode propose un modèle pour cela. Le modèle génère les fichiers ANSI C nécessaires, qui doivent être implémentés. Si vous souhaitez écrire du code Object-C , vous devez renommer GenerateThumbnailForURL. c et GeneratePreviewForURL. c en GenerateThumbnailForURL. m et GeneratePreviewForURL. m (et lisez attentivement la documentation Apple Devel;))

Démonstration basée sur un conteneur zip simple:

Vous devrez ajouter les fichiers Cocoa.framework et Foundation.framework à votre projet. Dans votre GenerateThumbnailForURL.c (c'est en partie hors de ma tête - donc aucune garantie que cela fonctionne hors de la boîte;)):

#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

Vous devrez également modifier votre fichier info.plist. Lorsque vous l'ouvrez, de nombreux champs sont prédéfinis. La plupart d'entre eux s'expliquent d'eux-mêmes (ou ne devront pas être changés), mais je devais ajouter la structure suivante (un copier / coller devrait suffire - copiez le texte, allez dans l'éditeur de plis et collez-le simplement.):

<?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>

Ceci enregistrera votre type de fichier $ fileExt $ et indiquera au système que votre type de fichier est un type de format zipy. Une belle référence, que j’ai utilisée ici est le plug-in QuickLook IPA de googlecode

Sous Windows, vous avez besoin de mettre en place un gestionnaire d’icônes. J'ai fait cela il y a plusieurs lunes et ce n'est pas difficile tant que vous connaissez les bases du COM.

Voir: http://msdn.microsoft. com / fr-us / library / bb776857 (VS.85) .aspx

Pour Gnome, vous utilisez un vignette .

Cela dépend du système d'exploitation, à ma connaissance, il sera basé sur l'extension du fichier.

Les exécutables ont l’icône à l’intérieur du fichier (potentiellement plusieurs) comme & "ressource &";

.

Les fichiers de données sélectionnent une icône basée sur l'association de fichier.

Si vous voulez une icône personnalisée par fichier beaucoup plus difficile. soit vous voulez que le système d’exploitation pense qu’il s’agit d’un exécutable et que vous intégrez l’icône en tant que ressource dans le fichier, ou un lien profond dans le système d’exploitation pour remplacer la routine de sélection des icônes par défaut.

Je pense, & "Personnaliser propriétaire &"; L'icône ne peut contenir que des fichiers PE dans Windows. Toutes les autres icônes pour les extensions de fichier sont stockées dans le registre Windows.

Pour la spécification du fichier PE, vous pouvez consulter Un aperçu approfondi dans le format de fichier exécutable Win32 Portable et Peering à l'intérieur du PE: A Visite guidée du format de fichier exécutable Win32 Portable .

Comment ça marche dans les autres OS, je ne sais pas: /.

Je ne connais pas Linux, mais pour Windows, vous pouvez commencer ici: http://msdn.microsoft.com/en-us/library/bb774614. aspx

Modifier: je pense que cette interface est conçue pour les vignettes affichées en mode vignettes et non pour les icônes. Désolé de perdre votre temps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top