2016-11-18 26 views
2

从UIImage创建缩略图我想使用函数CGImageSourceCreateThumbnailAtIndexUIImage创建缩略图。我所拥有的是UIImage本身。该图片是UIView上的快照。使用CGImageSourceCreateThumbnailAtIndex

请不要使用任何其他方法创建缩略图,只是使用CGImageSourceCreateThumbnailAtIndex的缩略图,因为我想将其性能与其他已有方法进行比较。

说,这是我迄今的代码。

我已创建一个UIImage类与此代码:

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

我的问题是这一行:

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

这个函数的第一个参数需要一个CGImageSourceRef,但就像我说的,我只是有一个UIImage,该图像是在内存中,而不是在磁盘上,我不想将它保存到磁盘,或性能会下降。

我如何从UIImage是在内存CGImageSourceRef ???

+0

什么内存?所有图像实例都在内存中。使用它作为@Nirav D说。 –

回答

5

你有没有尝试使用CGImageSourceCreateWithData并传递图像数据作为CFDataRef这个样子。

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; 

注:如果您有图像的URL那么你可以使用CGImageSourceCreateWithURL创建CGImageSourceRef

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

多数民众赞成它!谢谢! – SpaceDog

+0

是否有任何swift 3版本的代码? – JAHelia

3

斯威夫特4码

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

这系列网络搜索后,真的很方便!感谢这个美妙的解决方案。 – Aweda