2016-11-18 7 views
2

Я хочу использовать функцию CGImageSourceCreateThumbnailAtIndex для создания миниатюры с UIImage. Все, что у меня есть, это UIImage. Изображение представляет собой снимок на UIView.Создание эскиза из UIImage с использованием 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, это изображение находится в памяти, а не на диске, и я не хочу сохранять его на диск, или производительность будет снижаться.

Как получить CGImageSourceRef от UIImage, который находится на памяти ???

+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 изображения, то вы можете создать CGImageSourceRef с помощью CGImageSourceCreateWithURL.

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

вот оно! БЛАГОДАРЯ! – SpaceDog

+0

есть ли быстрая версия 3 кода? – JAHelia

3

Swift 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