¿Cómo consigo que los archivos en mi propio formato de archivo tengan su propio ícono dinámico?

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

  •  02-07-2019
  •  | 
  •  

Pregunta

Nuestra aplicación tiene un formato de archivo similar al formato de archivo OpenDocument (ver http://en.wikipedia.org/wiki/OpenDocument) - es decir.comprimido con un archivo de manifiesto, una imagen en miniatura, etc.

Noto que los archivos de OpenOffice tienen una imagen de vista previa del archivo de Open Office como ícono, tanto en Windows como en Linux.¿Hay alguna manera de lograr esto para nuestros archivos?es decir.¿Quiero un ícono dinámico basado en el archivo miniatura interno.png?

Editar 1 Vaya, gracias por todas las respuestas rápidas. Miniatura Se ve genial para el mundo GNOME.Windows Buscaré esos enlaces, gracias.En cuanto a la pregunta del comentario:mediante programación O a través de nuestro instalador.

Editar 2 Ah, me olvidé de Mac.¿Qué tal en Mac?(¡Lo siento, amantes de Mac!) ¿También hay algún enlace o información sobre cómo OpenOffice hace sus cosas IconHandler, ya que el nuestro sería muy similar?

¿Fue útil?

Solución

ventanas

Lo que necesitas es un Controlador de iconos, también conocido como controlador de miniaturas.A continuación se muestra un ejemplo escrito como control x activo.

Otro recurso es buscar Manejadores de propiedades, que también debería indicarle la mejor y más reciente forma de manejar correctamente los metadatos dinámicos en Windows.

Estos son dinámica soluciones: no son necesarias si solo desea un ícono asociado con todos sus archivos; solo se usan cuando desea que el Explorador de Windows muestre un ícono según lo que hay en el archivo, no solo la extensión, y cuando el archivo cambia de formato. El icono se actualiza para reflejar los cambios.Tampoco tiene que ser una imagen del archivo en sí, el controlador de miniaturas puede generar cualquier imagen basada en el contenido del archivo.

El controlador de propiedades actualiza otros metadatos, como la duración de la canción o del vídeo, para que pueda utilizar todos los metadatos que admite Windows Explorer.

En cuanto al soporte MAC, esta página dice: "Los sistemas operativos Mac y Windows tienen diferentes métodos para habilitar este tipo de miniaturas y, en el caso de Mac OS, esta compatibilidad ha sido inconsistente de una versión a otra, por lo que no se ha implementado [para Adobe InDesign]. "

OSX

Los iconos para Mac OSX están determinados por el Iniciar base de datos de servicios.Sin embargo, se refiere a un archivo de icono estático para todos los archivos manejados por una aplicación registrada (no se basa en la extensión: cada archivo tiene metadatos adjuntos que determinan la aplicación a la que pertenece, aunque las extensiones dan pistas cuando los metadatos no lo hacen). existen, como obtener el archivo desde un sistema operativo o sistema de archivos diferente)

Parece que Finder proporciona la funcionalidad de ícono dinámico en OSX, pero las búsquedas no arrojan indicaciones fáciles en esta dirección.Dado que Finder sigue cambiando con el tiempo, puedo ver por qué este objetivo es difícil de alcanzar...

Gnomo

Para Gnome usas un miniatura.(gracias Dorward)

Este es un programa extraordinariamente simple de escribir, que tiene 3 argumentos de línea de comando:

  • nombre del archivo de entrada, el archivo que está describiendo con la miniatura (o URI si los acepta)
  • nombre del archivo de salida, donde debe escribir el PNG
  • tamaño, un número, en píxeles, que describe el tamaño máximo de imagen cuadrada que debe producir (128 --> 128x128 o menor)

Ojalá todos los sistemas fueran así de simples.Por otro lado, esto no admite animación y algunas otras características proporcionadas por complementos más difíciles de implementar en otros sistemas.

KDE

No estoy un poco seguro, pero hay algunos consejos que deberían ayudarte a empezar.Primero, Konqueror es el administrador de archivos y muestra los íconos; admite íconos dinámicos para algunos tipos incorporados, pero no sé si están codificados o si son complementos que puede escribir.Revisar la Tutorial de componentes integrados como punto de partida.

Hay una característica nueva (¿más o menos?) (o característica planificada...) llamada Plasma que tiene mucho que ver con los íconos y la funcionalidad de los íconos.Verificar este anuncio y esta implementación inicial.

Es posible que necesites profundizar en el código fuente de Konqueror y comprobar cómo lo hicieron con archivos de texto y otros ya implementados.

-Adán

Otros consejos

Mac OSX desde la versión 10.5…

… tiene dos enfoques:

  1. Su documento está en el formato de paquete estándar de OSX y tiene una imagen estáticaEsto se puede hacer creando una subcarpeta QuickLook y colocando Thumbnail/Preview.png/tiff/jpg dentro.

  2. Todo lo demas necesita un complemento generador de QuickLook que se puede almacenar en /Library/QuickLook ~/Library/QuickLook o dentro de las carpetas YourApp.app/Contents/Library/QuickLook.

Este generador se utiliza para crear miniaturas y vistas previas de QuickLook sobre la marcha.XCode ofrece una plantilla para esto.La plantilla genera lo necesario. ANSI-C archivos que deben implementarse.si quieres escribir Objeto-C código, debe cambiar el nombre de GenerateThumbnailForURL.C y GenerarPreviewForURL.C para Generar miniatura para URL.metro y GenerarPreviewForURL.metro (y lea atentamente los Apple Devel Docs;))


Demostración simple basada en contenedor zip:

Tendrá que agregar el Cocoa.framework y Foundation.framework a su proyecto en su Generatethumbnailforurl.c (esto está en parte fuera de mi cabeza, así que no hay garantía de que funcione fuera de la caja;))::

#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;
}

Lista de información

También tendrás que modificar tu archivo info.plist; cuando lo abres, tiene muchos campos preestablecidos.La mayoría de ellos se explican por sí solos (o no tendrán que cambiarse), pero tuve que agregar la siguiente estructura (copiar y pegar debería ser suficiente; copie el texto, vaya al editor de plist y simplemente péguelo):

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

Esto registrará su tipo de archivo $fileExt$ y le dirá al sistema que su tipo de archivo tiene un formato zipy.Una buena referencia que utilicé aquí es la Complemento QuickLook IPA de Googlecode

En Windows, lo que necesitas es implementar un controlador de iconos.Hice esto hace muchas lunas y no es difícil siempre que conozcas los conceptos básicos de COM.

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

Para Gnome usas un miniatura.

Hasta donde yo sé, esto depende del sistema operativo y se basará en la extensión del archivo.

Los ejecutables tienen el icono dentro del archivo (potencialmente varios) como "recurso".

Los archivos de datos seleccionan un icono según la asociación de archivos.

Si desea un ícono personalizado por archivo, es mucho más difícil.o necesita engañar al sistema operativo haciéndole creer que es un ejecutable e incrustar el ícono como un recurso en el archivo, o realizar un vínculo profundo al sistema operativo para anular la rutina de selección de íconos predeterminada.

Creo que el ícono "propio personalizado" solo puede tener archivos PE en Windows.Todos los demás íconos para extensiones de archivos se almacenan en el registro de Windows.

Para conocer las especificaciones del archivo PE, puede consultar Una mirada en profundidad al formato de archivo ejecutable portátil Win32 y Mirando dentro del PE:Un recorrido por el formato de archivo ejecutable portátil Win32.

Cómo funciona en otros sistemas operativos, no lo sé :/.

No sé sobre Linux, pero para Windows puedes comenzar aquí:http://msdn.microsoft.com/en-us/library/bb774614.aspx

Editar: Creo que esta interfaz es para las miniaturas que se muestran en la vista de miniaturas, no para los íconos.Lo siento por hacerte perder el tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top