Como faço para que os arquivos no meu próprio formato de arquivo para ter seu próprio ícone dinâmico?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

A nossa aplicação tem um formato de arquivo semelhante ao formato de arquivo OpenDocument (ver http: //en.wikipedia. org / wiki / OpenDocument ) -. ie zipado com um arquivo de manifesto, uma imagem em miniatura, etc

Eu noto que arquivos OpenOffice tem uma imagem de visualização do arquivo Open Office como seus ícones, tanto em Windows e em Linux. Existe alguma maneira de conseguir isso para os nossos arquivos: ou seja, eu quero um ícone dinâmico baseado no thumbnail.png interna

Editar 1 Puxa, obrigado por todas as respostas rápidas. Thumbnailer parece ótimo para o mundo do GNOME. Janelas eu vou estar olhando para esses links, obrigado. Quanto à questão comentário:. Programação ou através do nosso instalador

Editar 2 Oh, esqueceu Mac. Que tal no Mac? (Desculpe amantes do Mac!) Também existem links ou informações de como OpenOffice faz suas coisas IconHandler? - desde nosso seria muito semelhante

Foi útil?

Solução

Windows

O que você precisa é um Ícone Handler , também conhecido como um manipulador de Thumbnail. Aqui está um exemplo escrito como um ativa x controle.

Outro recurso é olhar para cima Manipuladores de Propriedade , que também deve apontar para você a maneira mais recente e maior de ter dados de meta dinâmica tratado corretamente no Windows.

Estes são dinâmico soluções - eles não são necessários se você quiser apenas um ícone associado com todos os seus arquivos - eles só são usados ??quando você quer o Windows Explorer para exibir um ícone com base no que está no arquivo, e não apenas a extensão, e quando o arquivo muda o ícone é atualizado para refletir as alterações. Ele não tem que ser uma imagem do próprio arquivo, também, o manipulador de miniaturas pode gerar qualquer imagem com base no conteúdo do arquivo.

O manipulador de propriedade atualiza outros metadados, como música ou duração do vídeo, assim você pode usar todos os metadados do Windows Explorer apoios.

Quanto ao suporte MAC, desta página diz: "O Mac sistemas e operacionais Windows têm diferentes métodos de permitir que este tipo de unha do polegar, e no caso do Mac oS, este apoio tem sido inconsistente de versão para versão para que ele não tem sido prosseguida [para Adobe InDesign]. "

OS X

Os ícones para Mac OSX são determinados pelo Banco de Dados Lançamento Serviços . No entanto, ele se refere a um arquivo de ícone estático para todos os arquivos manipulados por um aplicativo registrado (não é baseado em extensão - cada arquivo tem metadados anexado que determina a aplicação a que pertence, embora as extensões dar dicas quando os dados meta não existem, como obter o arquivo de um sistema oS ou arquivo diferente)

Parece que a funcionalidade ícone dinâmico no OSX é fornecido pelo Finder, mas as pesquisas não estão trazendo os ponteiros fácil nesta direção. Desde localizador continua a mudar ao longo do tempo, posso ver por que essa meta é difícil de bater ...

Gnome

Para Gnome você usar um thumbnailer . (Graças Dorward )

Este é um programa extremamente simples de escrever, que tem argumentos de linha de 3 comando:

  • Nome do arquivo de entrada, o arquivo que você está descrevendo com a miniatura (ou URI se você aceitar aqueles em vez disso)
  • Nome do arquivo de saída, onde você precisa escrever o PNG
  • size, um número, em pixels, que descreve o tamanho máximo quadrado imagem que você deve produzir (128 -> 128x128 ou menor)

Desejo a todos os sistemas eram tão simples. Por outro lado, esta não suporta animação e algumas outras características que são fornecidos por mais difícil de implementar plugins em outros sistemas.

KDE

Estou um pouco incerto, mas existem algumas dicas que devem você começar. Primeiro é que o Konqueror é o gerenciador de arquivos e exibe os ícones - ele suporta ícones dinâmicos para alguns tipos embutido, mas eu não sei se estes são codificados, ou plugins que você pode escrever. Confira o incorporado Componentes Tutorial para um ponto de partida.

Há um novo (ish?) Recurso (ou recurso planejado ...) chamadaed Plasma que tem muito a ver com ícones e funcionalidade ícone. Confira este announcment e esta implementação inicial.

Você pode precisar cavar a fonte do Konqueror e confira como eles fizeram isso para arquivos de texto e outras já implementadas.

-Adam

Outras dicas

Mac OSX desde a versão 10.5 ...

... tem duas abordagens:

  1. O documento está no formato padrão pacote OSX e tem uma imagem estática Isto pode ser feito através da criação de uma subpasta QuickLook e colocando o Thumbnail / preview.png / tiff / jpg dentro.

  2. Everything else precisa de um QuickLook gerador de plugin que podem ser armazenados em / Library / QuickLook ~ / Library / QuickLook ou dentro das pastas YourApp.app/Contents/Library/QuickLook.

Este gerador está sendo usado para criar visualizações de miniaturas e QuickLook na mosca. Xcode oferece um modelo para isso. O modelo gera os necessários ANSI C arquivos que têm de ser implementadas. Se você quer escrever Object-C código que você tem que mudar o nome do GenerateThumbnailForURL. c e GeneratePreviewForURL. c para GenerateThumbnailForURL. m e GeneratePreviewForURL m (e ler Apple Devel Docs com cuidado;)).


Simples recipiente zip demonstração base:

Você terá que adicionar o Cocoa.framework e Foundation.framework ao seu projeto Em sua GenerateThumbnailForURL.c (isto é, em parte, fora da minha cabeça - por isso nenhuma garantia de que ele funciona fora da caixa;)):

#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

Você terá que modificar seu arquivo info.plist também - quando você abri-lo ele tem um monte de campos pré-set. A maioria deles são auto-explicando (ou não terá que ser alterado), mas eu tive que adicionar a seguinte estrutura (. Pasta de cópia deve fazer - copiar o texto, vá para o editor plist e basta colar):

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

Isto irá registrar o seu filetype $ FileExt $ e dizer ao sistema que o seu tipo de arquivo é um tipo de formato Zipy. Um bom refference, que eu usei aqui é o QuickLook IPA Plugin de GoogleCode

No Windows, o que você precisa é implementar um ícone Handler. Eu fiz isso há muitas luas e não é difícil, desde que você sabe o básico de COM.

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

Para Gnome você usar um thumbnailer .

Este é até o sistema operacional, tanto quanto eu sei, ele será baseado na extensão do arquivo.

executáveis ??tem o ícone dentro do arquivo (potencialmente múltipla) como um "recurso".

Os arquivos de dados pegar um ícone com base na associação de arquivo.

Se você quer um ícone personalizado por arquivo que é muito mais difícil. você quer necessidade também enganar o OS a pensar que é um executável e incorporar o ícone como um recurso no arquivo, ou link profundamente no sistema operacional para substituir a rotina ícone padrão de seleção.

Eu penso, "custom própria" ícone pode ter apenas arquivos PE no Windows. Todos os outros ícones para extensões de arquivo são armazenadas no registro do Windows.

Para a especificação de arquivo de PE, você pode olhar para um profundo olhar para o Win32 portátil formato arquivo executável e Peering dentro do PE: a Visita do Win32 Portable Executable File Format .

Como funciona em outro sistema operacional, eu não sei.: /

Eu não sei sobre Linux, mas para Windows você pode começar aqui: http://msdn.microsoft.com/en-us/library/bb774614. aspx

Editar: Eu acho que essa interface é para as miniaturas mostradas em miniaturas, não ícones. Desculpe por desperdiçar seu tempo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top