/ / C'è un modo per fare compressione lossless per GIF generati? - ios, gif, compressione senza perdita di dati

C'è un modo per fare compressione lossless per GIF generati? - ios, gif, compressione senza perdita di dati

Stiamo usando il seguente codice per generare GIFfile da un set di immagini JPEG, per l'impostazione di fare la compressione lossless, non sembra affatto generare un file di dimensioni minori. Stiamo facendo la cosa giusta qui?

CGImageDestinationRef imageDestination = CGImageDestinationCreateWithURL((CFURLRef)pathUrl, CFSTR("com.compuserve.gif"), images.count, NULL);

// image/frame level properties
NSDictionary *imageProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat:delayTime], (NSString *)kCGImagePropertyGIFDelayTime,
nil];
NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
imageProperties, (NSString *)kCGImagePropertyGIFDictionary,
nil];

for (UIImage *image in [images objectEnumerator]) {
CGImageDestinationAddImage(imageDestination, image.CGImage, (CFDictionaryRef)properties);
}

// gif level properties
NSDictionary *gifProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:0], (NSString *)kCGImagePropertyGIFLoopCount,
[NSNumber numberWithInt:1.0], kCGImageDestinationLossyCompressionQuality,
nil];
properties = [NSDictionary dictionaryWithObjectsAndKeys:
gifProperties, (NSString *)kCGImagePropertyGIFDictionary,
nil];
CGImageDestinationSetProperties(imageDestination, (CFDictionaryRef)properties);
CGImageDestinationFinalize(imageDestination);
CFRelease(imageDestination);

risposte:

1 per risposta № 1

Il formato di immagine GIF è una compressione senza perdita di dati. Tuttavia si sta comprimendo un formato compresso (con perdita). Le dimensioni del file potrebbero aumentare.


2 per risposta № 2

GIF non supporta il kCGImageDestinationLossyCompressionQuality proprietà. Nessun supporto per la compressione di gif su iOS per quanto posso dire - non sono riuscito a far funzionare la mappa dei colori.

const CFStringRef kCGImagePropertyGIFLoopCount;
const CFStringRef kCGImagePropertyGIFDelayTime;
const CFStringRef kCGImagePropertyGIFImageColorMap;
const CFStringRef kCGImagePropertyGIFHasGlobalColorMap;
const CFStringRef kCGImagePropertyGIFUnclampedDelayTime;

Riferimento: https://developer.apple.com/library/ios/documentation/graphicsimaging/Reference/CGImageProperties_Reference/Reference/reference.html#//apple_ref/doc/constant_group/GIF_Dictionary_Keys


0 per risposta № 3

Le immagini Jpeg contengono molte molto simili ma nonpixel identici, che sono molto difficili da comprimere per schemi di compressione senza perdita di dati. Per ottenere una compressione migliore devi prima quantizzare i colori. Le immagini Gif saranno prive di perdite dopo che avrai perso l'informazione per rendere l'immagine comprimibile.