Come faccio a ottenere i file nel mio formato di file per avere la propria icona dinamica?

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

  •  02-07-2019
  •  | 
  •  

Domanda

La nostra applicazione ha un formato di file simile al formato di file OpenDocument (vedere http: //en.wikipedia. org / wiki / OpenDocument ) - ovvero compresso con un file manifest, una miniatura, ecc.

Ho notato che i file OpenOffice hanno un'immagine di anteprima del file Open Office come icone, sia in Windows che in Linux. Esiste un modo per ottenere questo risultato per i nostri file: ovvero voglio un'icona dinamica basata sulla thumbnail.png interna?

Modifica 1 Caspita, grazie per tutte le risposte rapide. Thumbnailer è perfetto per il mondo GNOME. Windows esaminerò quei collegamenti, grazie. Per quanto riguarda la domanda di commento: programmaticamente O tramite il nostro programma di installazione.

Modifica 2 Oh, ho dimenticato il Mac. Che ne dici di Mac? (Mi dispiace per gli amanti dei Mac!) Inoltre ci sono collegamenti o informazioni su come OpenOffice fa le loro cose su IconHandler - dato che le nostre sarebbero molto simili?

È stato utile?

Soluzione

di Windows

Ciò di cui hai bisogno è un Icon Handler , noto anche come gestore di miniature. Ecco un esempio scritto come controllo x attivo .

Un'altra risorsa è cercare Gestori di proprietà , che dovrebbe anche indicare il modo più recente e ottimale di gestire correttamente i metadati dinamici in Windows.

Queste sono soluzioni dinamiche - non sono necessarie se si desidera solo un'icona associata a tutti i file - vengono utilizzate solo quando si desidera che Windows Explorer visualizzi un'icona basata su ciò che è nel file, non solo l'estensione, e quando il file cambia l'icona viene aggiornata per riflettere le modifiche. Non deve essere nemmeno un'immagine del file stesso, il gestore delle miniature può generare qualsiasi immagine in base al contenuto del file.

Il gestore della proprietà aggiorna altri metadati, come la lunghezza del brano o del video, in modo da poter utilizzare tutti i metadati supportati da Esplora risorse di Windows.

Per quanto riguarda il supporto MAC, questa pagina dice " I sistemi operativi Mac e Windows hanno diversi metodi per abilitare questo tipo di anteprima e, nel caso di Mac OS, questo supporto è stato incoerente da una versione all'altra, quindi non è stato perseguito [per Adobe InDesign]. < !> quot;

OS X

Le icone per Mac OSX sono determinate dal Database dei servizi di lancio . Tuttavia, si riferisce a un file icona statico per tutti i file gestiti da un'applicazione registrata (non si basa sull'estensione - ogni file ha dei metadati allegati che determinano l'applicazione a cui appartiene, sebbene le estensioni forniscano suggerimenti quando i metadati non lo fanno esiste, come ottenere il file da un diverso sistema operativo o file system)

Sembra che la funzionalità dell'icona dinamica in OSX sia fornita da Finder, ma le ricerche non portano a nessun semplice puntatore in questa direzione. Poiché Finder continua a cambiare nel tempo, posso capire perché questo obiettivo è difficile da raggiungere ...

Gnome

Per Gnome usi un thumbnailer . (grazie Dorward )

Questo è un programma straordinariamente semplice che scrivi, che ha 3 argomenti da riga di comando:

  • nome del file di input, il file che stai descrivendo con la miniatura (o l'URI se invece li accetta)
  • nome del file di output, in cui è necessario scrivere il PNG
  • dimensione, un numero, in pixel, che descrive la dimensione massima dell'immagine quadrata che dovresti produrre (128 - > 128x128 o inferiore)

Vorrei che tutti i sistemi fossero così semplici. D'altra parte, ciò non supporta l'animazione e alcune altre funzionalità fornite da plugin più difficili da implementare su altri sistemi.

KDE

Sono un po 'incerto, ma ci sono alcuni suggerimenti che dovrebbero iniziare. Il primo è che Konqueror è il file manager e visualizza le icone: supporta icone dinamiche per alcuni tipi integrati, ma non so se questi sono hardcoded o plug-in che puoi scrivere. Consulta il Tutorial sui componenti integrati per un punto di partenza.

C'è una nuova funzionalità (ish?) (o planned ... ... chiamato Plasma che ha molto a che fare con le icone e la funzionalità delle icone. Dai un'occhiata a questo annuncio e questa implementazione iniziale .

Potrebbe essere necessario scavare nella fonte di Konqueror e controllare come hanno fatto per i file di testo e altri già implementati.

-Adam

Altri suggerimenti

Mac OSX dalla versione 10.5 & # 8230;

&

# 8230; ha due approcci:

  1. Il documento è nel formato bundle OSX standard e presenta un'immagine statica Questo può essere fatto creando una sottocartella QuickLook e inserendo l'anteprima / Preview.png / tiff / jpg all'interno.

  2. Tutto il resto richiede un plug-in generatore QuickLook che può essere archiviato in / Library / QuickLook ~ / Library / QuickLook o all'interno delle cartelle YourApp.app/Contents/Library/QuickLook.

Questo generatore viene utilizzato per creare anteprime e anteprime QuickLook al volo. XCode offre un modello per questo. Il modello genera i file ANSI C necessari che devono essere implementati. Se vuoi scrivere il codice Object-C devi rinominare GenerateThumbnailForURL. c e GeneratePreviewForURL. c in GenerateThumbnailForURL. m e GeneratePreviewForURL. m (e leggi attentamente Apple Develop Docs;))


Demo basata su container zip semplice:

Dovrai aggiungere Cocoa.framework e Foundation.framework al tuo progetto Nel tuo GenerateThumbnailForURL.c (questo è parzialmente fuori dalla mia testa - quindi nessuna garanzia che funzioni fuori dalla scatola;)):

#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

Dovrai modificare anche il tuo file info.plist - quando lo apri ha molti campi preimpostati. Molti di loro si spiegano da soli (o non dovranno essere modificati) ma ho dovuto aggiungere la seguente struttura (copia incolla dovrebbe fare - copia il testo, vai nell'editor plist e semplicemente incolla):

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

Ciò registrerà il tipo di file $ fileExt $ e comunicherà al sistema che il tipo di file è di tipo zipy. Una buona referenza, che ho usato qui è il QuickLook IPA Plugin da googlecode

In Windows, è necessario implementare un gestore di icone. L'ho fatto molte lune fa e non è difficile finché si conoscono le basi di COM.

Vedi: http://msdn.microsoft. com / it-it / library / bb776857 (VS.85) aspx

Per Gnome usi un thumbnailer .

Questo dipende dal sistema operativo, per quanto ne so, sarà basato sull'estensione del file.

Gli eseguibili hanno l'icona all'interno del file (potenzialmente multipla) come " risorsa " ;.

I file di dati raccolgono un'icona in base all'associazione dei file.

Se vuoi un'icona personalizzata per file che è molto più difficile. o hai bisogno di ingannare troppo il sistema operativo per pensare che sia un eseguibile e incorporare l'icona come risorsa nel file, o un collegamento diretto nel sistema operativo per ignorare la routine di selezione delle icone predefinita.

Penso, " custom own " L'icona può contenere solo file PE in Windows. Tutte le altre icone per le estensioni dei file sono memorizzate nel registro di Windows.

Per le specifiche del file PE, puoi consultare Approfondimento nel formato di file eseguibile portatile Win32 e Peering Inside the PE: A Tour del formato di file eseguibile portatile Win32 .

Come funziona in altri sistemi operativi, non lo so: /.

Non conosco Linux, ma per Windows puoi iniziare qui: http://msdn.microsoft.com/en-us/library/bb774614. aspx

Modifica: penso che questa interfaccia sia per le miniature mostrate nella vista miniature, non per le icone. Ci scusiamo per aver perso tempo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top