file - recuperar - ¿Cómo obtengo archivos en mi propio formato de archivo para tener su propio ícono dinámico?
como cambiar la extension de un video (9)
Nuestra aplicación tiene un formato de archivo similar al formato de archivo de OpenDocument (consulte http://en.wikipedia.org/wiki/OpenDocument ), es decir, está comprimido con un archivo de manifiesto, una imagen en miniatura, etc.
Observé que los archivos de OpenOffice tienen una imagen de vista previa del archivo de Open Office como iconos, tanto en Windows como en Linux. ¿Hay alguna forma de lograr esto para nuestros archivos: es decir, quiero un ícono dinámico basado en thumbnail.png interno?
Edit 1 Wow, gracias por todas las respuestas rápidas. Thumbnailer se ve muy bien para el mundo de GNOME. Windows Buscaré esos enlaces, gracias. En cuanto a la pregunta de comentario: programáticamente O a través de nuestro instalador.
Editar 2 Ah, se olvidó de Mac. ¿Qué hay de la Mac? (¡Lo siento, amantes de Mac!) ¿También hay enlaces o información sobre cómo OpenOffice hace sus cosas con IconHandler, ya que la nuestra sería muy similar?
Creo que el ícono "custom own" solo puede tener archivos PE en Windows. Todos los otros iconos para extensiones de archivo se almacenan en el registro de Windows.
Para la especificación del archivo PE, puede consultar Una mirada profunda en el formato de archivo ejecutable portátil Win32 y Peering Inside the PE: un recorrido por el formato de archivo ejecutable portátil Win32 .
Cómo funciona en otro sistema operativo, no sé: /.
En Windows, lo que necesita es implementar un Icon Handler. Hice esto hace muchas lunas y no es difícil siempre y cuando conozcas los conceptos básicos de COM.
Ver: http://msdn.microsoft.com/en-us/library/bb776857(VS.85).aspx
Esto depende del sistema operativo, que yo sepa, se basará en la extensión del archivo.
Los ejecutables tienen el icono dentro del archivo (potencialmente múltiples) como un "recurso".
Los archivos de datos seleccionan un ícono basado en la asociación de archivos.
Si desea un icono personalizado por archivo, es mucho más difícil. también es necesario engañar al sistema operativo para que crea que es un ejecutable e insertar el icono como un recurso en el archivo, o un enlace profundo en el sistema operativo para anular la rutina de selección de icono predeterminada.
No sé sobre Linux, pero para Windows puede 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 en miniatura, no en los iconos. Lo siento por hacerte perder el tiempo.
Para Gnome usas una thumbnailer .
para WINDOWS prueba esto:
Mac OSX desde la versión 10.5 ...
... tiene dos enfoques:
Su documento está en el formato de paquete OSX estándar y tiene una imagen estática Esto se puede hacer creando una subcarpeta QuickLook y colocando Thumbnail / Preview.png / tiff / jpg dentro.
Todo lo demás necesita un complemento del generador QuickLook que se puede almacenar en / Library / QuickLook ~ / Library / QuickLook o dentro de YourApp.app/Contents/Library/QuickLook Folders.
Este generador se usa para crear vistas previas de miniaturas y QuickLook sobre la marcha. XCode ofrece una plantilla para esto. La plantilla genera los archivos ANSI C necesarios que deben implementarse. Si desea escribir el código Object-C , debe cambiar el nombre de GenerateThumbnailForURL. c y GeneratePreviewForURL. c para GenerarThumbnailForURL. my GeneratePreviewForURL. m (y lea los Apple Devel Docs con cuidado;))
Demostración basada en contenedor zip simple:
Deberá agregar los marcos Cocoa.framework y Foundation a su proyecto En su GenerateThumbnailForURL.c (esto está en parte fuera de mi cabeza, así que no hay garantía de que funcione 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;
}
Info.plist
También deberá modificar su archivo info.plist; cuando lo abra, tiene una gran cantidad de campos preestablecidos. La mayoría de ellos son autoexplicativos (o no tendrán que ser cambiados) pero tuve que agregar la siguiente estructura (copiar y pegar debería ser así: copiar el texto, ir al editor plist y simplemente pegar).
<?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 es un tipo de formato zipy. Una buena referencia, que he usado aquí es el complemento QuickLook IPA de googlecode
Windows
Lo que necesita es un Icon Handler , también conocido como Thumbnail Handler. Aquí hay un ejemplo escrito como un control x activo .
Otro recurso es buscar Property Handlers , que también debe indicarle la última y mejor forma de tener los metadatos dinámicos manejados correctamente en Windows.
Estas son soluciones dinámicas , no son necesarias si solo desea un ícono asociado con todos sus archivos, solo se utilizan cuando desea que Windows Explorer muestre un ícono basado en lo que está en el archivo, no solo en la extensión, y cuando el cambios en el archivo, el icono se actualiza para reflejar los cambios. Tampoco tiene que ser una imagen del archivo en sí, el manejador de miniaturas puede generar cualquier imagen en función del contenido del archivo.
El controlador de propiedades actualiza otros metadatos, como la duración de la canción o el video, para que pueda usar todos los metadatos compatibles con Windows Explorer.
Con respecto al soporte MAC, esta página dice: "Los sistemas operativos Mac y Windows tienen diferentes métodos para habilitar este tipo de miniatura, y en el caso del sistema operativo Mac, este soporte ha sido inconsistente de una versión a otra por lo que no se ha perseguido [para Adobe InDesign] ".
OS X
Los iconos para Mac OSX están determinados por la Base de Datos de Servicios de Lanzamiento . 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 existir, como obtener el archivo de un sistema operativo o sistema de archivos diferente)
Parece que Finder proporciona la funcionalidad del ícono dinámico en OSX, pero las búsquedas no muestran ningún puntero fácil en esta dirección. Dado que Finder sigue cambiando con el tiempo, puedo ver por qué es difícil alcanzar este objetivo ...
Gnomo
Para Gnome usas una thumbnailer . (gracias Dorward )
Este es un programa extraordinariamente simple que usted escribe, que tiene 3 argumentos de línea de comando:
- ingrese el nombre del archivo, el archivo que está describiendo con la miniatura (o URI si los acepta en su lugar)
- nombre de archivo de salida, donde debe escribir el archivo PNG
- tamaño, un número, en píxeles, que describe el tamaño máximo de la imagen cuadrada que debe producir (128 -> 128x128 o menos)
Ojalá todos los sistemas fueran así de simples. Por otro lado, esto no es compatible con la animación y algunas otras características proporcionadas por complementos más difíciles de implementar en otros sistemas.
KDE
Soy un poco inseguro, pero hay algunos consejos que deberían ayudarte a empezar. Lo primero es que 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 de manera rígida o complementos que puede escribir. Consulte el Tutorial de componentes incrustados para obtener un punto de partida.
Hay una nueva función (¿o función planificada ...?) Llamada Plasma, que tiene mucho que ver con los iconos y la funcionalidad de los iconos. Vea este anuncio y esta implementación inicial .
Es posible que necesite profundizar en el origen de Konqueror y comprobar cómo lo hicieron para los archivos de texto y otros ya implementados.
-Adán