CGImage создает миниатюру изображения нужного размера

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

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

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

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

person Dhanaraj    schedule 19.11.2009    source источник


Ответы (2)


Если вам нужна миниатюра размером 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
person matt    schedule 10.02.2011
comment
Неясно, хочет ли OP, чтобы «1024» было меньшим или большим размером результирующего эскиза - он только говорит, что хочет сохранить соотношение сторон исходного изображения - что в любом случае является единственным поддерживаемым поведением. Однако, если OP хочет, чтобы 1024 был минимальным размером, они могут довольно легко вычислить его из исходного размера изображения, например, следующим образом: ratio = MIN (original.size.width, original.size.height) / 1024; maxSize = MAX(исходный.размер.ширина, исходный.размер.высота) * соотношение; - и используйте «maxSize» в словаре. - person Motti Shneor; 05.11.2019

Swift 3 версия ответа:

func loadImage(at url: URL, maxDimension max: Int) -> UIImage? {
    
    guard let imageSource = CGImageSourceCreateWithURL(url as CFURL, nil)
        else {
            return nil
    }

    let options: [CFString: Any] = [
        kCGImageSourceShouldAllowFloat: true,
        kCGImageSourceCreateThumbnailWithTransform: true,
        kCGImageSourceCreateThumbnailFromImageAlways: true,
        kCGImageSourceThumbnailMaxPixelSize: max
    ]
    
    guard let thumbnail = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary)
        else {
            return nil
    }
    
    return UIImage(cgImage: thumbnail)
}
person Aleks N.    schedule 15.03.2017