2012-01-03 15 views
6

En referencia CGImageDestinationRef de Apple se menciona que It can contain thumbnail images as well as properties for each image. La parte con las propiedades funciona bien, estableciendo el parámetro properties al añadir una imagen a la CGImageDestinationRef, pero no puedo encontrar la manera de agregar la miniatura.añadir a CGImageDestinationRef

Quiero añadir una imagen en miniatura (o pasar directamente de un CGImageSourceRef) a CGImageDestinationRef, de tal manera que cuando la imagen resultante se abrió con CGImageSourceRef puedo usar CGImageSourceCreateThumbnailAtIndex para recuperar la imagen inicial.

NSDictionary* thumbOpts = [NSDictionary dictionaryWithObjectsAndKeys: 
             (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform, 
             (id)kCFBooleanFalse, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent, 
             [NSNumber numberWithInt:128], (id)kCGImageSourceThumbnailMaxPixelSize, 
             nil]; 
CGImageRef thumb = CGImageSourceCreateThumbnailAtIndex(iSource, 0, (CFDictionaryRef)thumbOpts); 

El código anterior devuelve la miniatura de las imágenes que se han almacenado, pero cuando paso a través de la imagen CGImageDestinationRef, se pierde la vista en miniatura.

¿Hay alguna forma de conservar la miniatura original (o crear una nueva)? CGImageProperties Reference no parece tener ninguna clave donde almacenar la miniatura.

Respuesta

1

Una forma que he encontrado para recuperar una miniatura es especificar kCGImageSourceCreateThumbnailFromImageIfAbsent en el diccionario de configuración.

Especificar el diccionario de la siguiente manera

NSDictionary* thumbOpts = [NSDictionary dictionaryWithObjectsAndKeys: 
           (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent, 
           (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform, 
           [NSNumber numberWithInt:128], (id)kCGImageSourceThumbnailMaxPixelSize, 
           nil]; 

Actualización: Con el fin de añadir una imagen secundaria (en miniatura) para la CGImageDestinationRef original, haga lo siguiente después de añadir la imagen primaria

size_t thumbWidth = 640; 
size_t thumbHeight = imageHeight/(imageWidth/thumbWidth); 
size_t thumbBytesPerRow = thumbWidth * 4; 
size_t thumbTotalBytes = thumbBytesPerRow * thumbHeight; 
void *thumbData = malloc(thumbTotalBytes); 
CGContextRef thumbContext = CGBitmapContextCreate(thumbData, 
                thumbWidth, 
                thumbHeight, 
                8, 
                thumbBytesPerRow, 
                CGColorSpaceCreateDeviceRGB(), 
                kCGImageAlphaNoneSkipFirst); 

CGRect thumbRect = CGRectMake(0.f, 0.f, thumbWidth, thumbHeight); 
CGContextDrawImage(thumbContext, thumbRect, fullImage); 
CGImageRef thumbImage = CGBitmapContextCreateImage(thumbContext); 
CGContextRelease(thumbContext); 
CGImageDestinationAddImage(destination, thumbImage, nil); 
CGImageRelease(thumbImage); 

Luego, para volver a sacar la miniatura, haga lo siguiente

CFURLRef imageFileURLRef = (__bridge CFURLRef)url; 
NSDictionary* sourceOptions = @{(id)kCGImageSourceShouldCache: (id)kCFBooleanFalse, 
            (id)kCGImageSourceTypeIdentifierHint: (id)kUTTypeTIFF}; 
CFDictionaryRef sourceOptionsRef = (__bridge CFDictionaryRef)sourceOptions; 
CGImageSourceRef imageSource = CGImageSourceCreateWithURL(imageFileURLRef, sourceOptionsRef); 
CGImageRef thumb = CGImageSourceCreateImageAtIndex(imageSource, 1, sourceOptionsRef); 
UIImage *thumbImage = [[UIImage alloc] initWithCGImage:thumb]; 
CFRelease(imageSource); 
CGImageRelease(thumb); 
+0

Esto es más o menos El mismo código que agregué en la pregunta para obtener la miniatura. La pregunta pregunta cómo configurar la miniatura en 'CGImageDestinationRef'. –

+0

El diccionario de opciones para CGImageSourceCreateThumbnailAtIndex es para recuperar una miniatura de CGImageDestination. Si se establece kCGImageSourceCreateThumbnailFromImageIfAbsent en kCFBooleanTrue, se creará una miniatura si no está presente. Si está intentando agregar una imagen en miniatura al CGImageDestination, mi fragmento de código y el fragmento que publicó en su pregunta original son irrelevantes. Por favor vea mi respuesta actualizada sobre cómo agregar una miniatura y recuperarla. –

+0

Esto parece una solución decente. Sin embargo, esto solo funcionará para configurar y cargar la miniatura desde mi propia aplicación. Es probable que otras aplicaciones intenten obtener la miniatura almacenada en la memoria caché, no leer la imagen del índice 1. Esto también puede causar otros problemas si el contenedor de la imagen contiene más de 1 imagen. –

1

Ok, entonces como nadie respondió (incluso durante la recompensa), además de las horas que pasé tratando de pasar la miniatura, creo que la documentación de CGImageDestination es engañosa. No parece haber ninguna forma (documentada) de pasar la miniatura de la imagen a CGImageDestinationRef (al menos no hasta, incluyendo, OSX 10.7.0 e iOS 5.0).

Si alguien piensa lo contrario, publique una respuesta y la aceptaré (si es correcta).