CGImage создать миниатюру изображения с нужным размером - PullRequest
9 голосов
/ 19 ноября 2009

Я хочу создать эскиз с помощью компьютерной графики. Это создает эскизы.

Здесь я хочу получить миниатюру размером 1024 (с соотношением сторон.) Можно ли получить миниатюру нужного размера непосредственно из компьютерной графики?

В словаре опций я могу передать, что максимальный размер thumnail может быть создан, но есть ли способ иметь минимальный размер для того же самого ..?

 NSURL * url = [NSURL fileURLWithPath:inPath];
 CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
 CGImageRef image=nil;
 if (source)
 {
  NSDictionary* thumbOpts = [NSDictionary dictionaryWithObjectsAndKeys:
           (id) kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform, 
           (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent,
           [NSNumber numberWithInt:2048],  kCGImageSourceThumbnailMaxPixelSize,

           nil];

  image = CGImageSourceCreateThumbnailAtIndex(source, 0, (CFDictionaryRef)thumbOpts);   

  NSLog(@"image width = %d %d", CGImageGetWidth(image), CGImageGetHeight(image));
  CFRelease(source);
 }

Ответы [ 2 ]

19 голосов
/ 10 февраля 2011

Если вам требуется миниатюра размером 1024 (максимальное измерение), вы должны передать 1024, а не 2048. Кроме того, если вы хотите убедиться, что миниатюра создана в соответствии со своими спецификациями, вам следует запросить kCGImageSourceCreateThumbnailFromImageAlways, а не kCGImageSourceCreateThumbnailFromImageIfAbsent , поскольку последний может привести к использованию существующего эскиза, и он может быть меньше, чем вы хотите.

Итак, вот код, который делает то, что вы просите:

NSURL* url = // whatever;
NSDictionary* d = [NSDictionary dictionaryWithObjectsAndKeys:
                   (id)kCFBooleanTrue, kCGImageSourceShouldAllowFloat,
                   (id)kCFBooleanTrue, kCGImageSourceCreateThumbnailWithTransform,
                   (id)kCFBooleanTrue, kCGImageSourceCreateThumbnailFromImageAlways,
                   [NSNumber numberWithInt:1024], kCGImageSourceThumbnailMaxPixelSize,
                   nil];
CGImageSourceRef src = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
CGImageRef imref = CGImageSourceCreateThumbnailAtIndex(src, 0, (CFDictionaryRef)d);
// memory management omitted
2 голосов
/ 15 марта 2017

Swift 3 вариант ответа:

func loadImage(at url: URL, maxDimension max: Int) -> UIImage? {

    guard let imageSource = CGImageSourceCreateWithURL(url as CFURL, nil)
        else {
            return nil
    }

    let options = [
        kCGImageSourceShouldAllowFloat as String: true as NSNumber,
        kCGImageSourceCreateThumbnailWithTransform as String: true as NSNumber,
        kCGImageSourceCreateThumbnailFromImageAlways as String: true as NSNumber,
        kCGImageSourceThumbnailMaxPixelSize as String: max as NSNumber
    ] as CFDictionary

    guard let thumbnail = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options)
        else {
            return nil
    }

    return UIImage(cgImage: thumbnail)
}
...