2016-11-18 2 views
2

Je souhaite utiliser la fonction CGImageSourceCreateThumbnailAtIndex pour créer une miniature à partir d'un UIImage. Tout ce que j'ai, c'est le UIImage lui-même. L'image est l'instantané sur un UIView.Création d'une miniature à partir d'UIImage à l'aide de CGImageSourceCreateThumbnailAtIndex

S'il vous plaît, je ne veux pas utiliser d'autre méthode pour créer la vignette, juste celle utilisant CGImageSourceCreateThumbnailAtIndex, parce que je veux comparer ses performances avec les autres méthodes que j'ai déjà.

Dit que, c'est le code que j'ai jusqu'ici.

J'ai créer une catégorie UIImage avec ce code:

- (UIImage *)createSquaredThumbnailWithWidth:(NSInteger)width { 

    CFDictionaryRef options = (__bridge CFDictionaryRef) @{ 
                 (id) kCGImageSourceCreateThumbnailWithTransform : @YES, 
                 (id) kCGImageSourceCreateThumbnailFromImageAlways : @YES, 
                 (id) kCGImageSourceThumbnailMaxPixelSize : @(width) 
                 }; 

    CGImageRef scaledImageRef = CGImageSourceCreateThumbnailAtIndex(????, 0, options); 


    UIImage* scaled = [UIImage imageWithCGImage:scaledImageRef]; 

    CGImageRelease(scaledImageRef); 

    return scaled; 
} 

Mon problème est avec cette ligne:

CGImageRef scaledImageRef = CGImageSourceCreateThumbnailAtIndex(????, 0, options); 

Le premier paramètre de cette fonction exige une CGImageSourceRef, mais comme je l'ai dit, J'ai juste un UIImage, cette image est sur la mémoire, pas sur le disque, et je ne veux pas l'enregistrer sur le disque, ou la performance ira dans le drain.

Comment puis-je obtenir un CGImageSourceRef à partir d'un UIImage qui est sur la mémoire ???

+0

Qu'en est-il de la mémoire? toutes les instances d'image sont en mémoire. Utilisez-le comme @Nirav D a dit. –

Répondre

5

Avez-vous essayé d'utiliser CGImageSourceCreateWithData et de transmettre des données d'image comme CFDataRef comme ceci.

NSData *imageData = UIImagePNGRepresentation(image); 
CGImageSourceRef src = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); 
CFDictionaryRef options = (__bridge CFDictionaryRef) @{ 
                (id) kCGImageSourceCreateThumbnailWithTransform : @YES, 
                (id) kCGImageSourceCreateThumbnailFromImageAlways : @YES, 
                (id) kCGImageSourceThumbnailMaxPixelSize : @(width) 
                }; 

CGImageRef scaledImageRef = CGImageSourceCreateThumbnailAtIndex(src, 0, options); 
UIImage *scaled = [UIImage imageWithCGImage:scaledImageRef]; 
CGImageRelease(scaledImageRef); 
return scaled; 

Note: Si vous avez URL d'image que vous pouvez créer en utilisant CGImageSourceRefCGImageSourceCreateWithURL.

CGImageSourceRef src = CGImageSourceCreateWithURL((__bridge CFURLRef)(imageFileURL), NULL); 
+1

c'est tout! MERCI! – SpaceDog

+0

existe-t-il une version 3 du code? – JAHelia

3

Swift 4 Code

let imageData = UIImagePNGRepresentation(image)! 
let options = [ 
    kCGImageSourceCreateThumbnailWithTransform: true, 
    kCGImageSourceCreateThumbnailFromImageAlways: true, 
    kCGImageSourceThumbnailMaxPixelSize: 300] as CFDictionary 
let source = CGImageSourceCreateWithData(imageData, nil)! 
let imageReference = CGImageSourceCreateThumbnailAtIndex(source, 0, options)! 
let thumbnail = UIImage(cgImage: imageReference) 
+0

Cela est vraiment venu après une série de recherches sur le Web! Merci pour cette merveilleuse solution. – Aweda