Размер UIImage, возвращаемый с 'requestImageForAsset', даже не близок к настройке 'targetSize'

Я подробно прочитал последнюю работу фоторамки iOS8, и я пытаюсь извлечь некоторые ресурсы из библиотеки пользователей для отображения. Я разрешаю пользователю редактировать 4 изображения одновременно. Но из-за этого мне нужно сжать изображения, иначе приложение выйдет из строя.

Я использую PHImageManager для загрузки изображений с помощью следующего кода:

func processImages()
    {
        println("Processing")
        _selectediImages = Array()
        _cacheImageComplete = 0
        for asset in _selectedAssets
        {
            var options:PHImageRequestOptions = PHImageRequestOptions()
            options.version = PHImageRequestOptionsVersion.Unadjusted
            options.synchronous = true
            var minRatio:CGFloat = 1
            if(CGFloat(asset.pixelWidth) > UIScreen.mainScreen().bounds.width || CGFloat(asset.pixelHeight) > UIScreen.mainScreen().bounds.height)
            {
               minRatio = min(UIScreen.mainScreen().bounds.width/(CGFloat(asset.pixelWidth)), (UIScreen.mainScreen().bounds.height/CGFloat(asset.pixelHeight)))
            }
            var size:CGSize = CGSizeMake((CGFloat(asset.pixelWidth)*minRatio),(CGFloat(asset.pixelHeight)*minRatio))
            println("Target size is \(size)")
            PHImageManager.defaultManager().requestImageForAsset(asset, targetSize:size, contentMode: .AspectFill, options: options)
                {
                    uiimageResult, info in
                    var image = iImage(uiimage: uiimageResult)
                    println("Result Size Is \(uiimageResult.size)")
            }

        }

    }

Как вы можете видеть, я вычисляю целевой размер, чтобы убедиться, что изображение по крайней мере не больше экрана. Если это так, я уменьшаю масштаб изображения на изображении. Однако здесь типичный журнал печати

Размер цели (768,0 798,453531598513) Результат Размер Is (1614.0,1678.0)

Несмотря на то, что я устанавливаю целевой размер 768x798 (в этом конкретном случае), полученный UIImage, который он мне дает, более чем вдвое больше. Теперь, согласно документации, параметр targetSize

"Размер целевого изображения для возврата".

Не самое ясное объяснение, но из моих экспериментов оно НЕ соответствует этому.

Если у вас есть предложения, я бы хотел его услышать!

Ответ 1

В Swift вы хотите сделать что-то вроде этого:

var asset: PHAsset!
var imageSize = CGSize(width: 100, height: 100)

var options = PHImageRequestOptions()
options.resizeMode = PHImageRequestOptionsResizeMode.Exact
options.deliveryMode = PHImageRequestOptionsDeliveryMode.Opportunistic

PHImageManager.defaultManager().requestImage(asset, targetSize: imageSize, contentMode: PHImageContentMode.AspectFill, options: options) {
    (image, info) -> Void in
    // what you want to do with the image here
    print("Result Size Is \(image.size)")

}

В Objective-C это выглядит примерно так:

void (^resultHandler)(UIImage *, NSDictionary *) = ^(UIImage *result, NSDictionary *info) {
    // what you want to do with the image

};

CGSize cellSize = CGSizeMake(100, 100);

PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.resizeMode = PHImageRequestOptionsResizeModeExact;
options.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;

[[PHImageManager defaultManager] requestImageForAsset:self.imageAsset targetSize:cellSize contentMode:PHImageContentModeAspectFill options:options resultHandler:resultHandler];

Важное примечание: в режиме оппортунистической доставки результирующий блок может вызываться более одного раза с разными размерами, но последний вызов будет иметь нужный размер. Лучше использовать Opportunistic, чтобы пользовательский интерфейс сначала загружал заполнитель низкого качества, а затем обновлял его, поскольку ОС может генерировать более качественное изображение (вместо того, чтобы иметь пустой квадрат).

Ответ 2

Это потому, что requestImageForAsset будет вызываться дважды.

В первый раз он вернет изображение такого же размера, например (60 * 45), которое, я думаю, является миниатюрой этого изображения.

Во второй раз вы получите изображение полного размера.

Я использую

if ([[info valueForKey:@"PHImageResultIsDegradedKey"]integerValue]==0){ // Do something with the FULL SIZED image } else { // Do something with the regraded image }

чтобы отличить два разных изображения.

Ссылка: iOS 8 PhotoKit. Получите максимальное изображение из альбомов iCloud Photo Sharing

Ответ 3

Попробуйте установить для параметра resizeMode значение PHImageRequestOptionsResizeModeExact и deliveryMode PHImageRequestOptionsDeliveryModeHighQualityFormat;

PHImageRequestOptionsResizeModeExact, 
// same as above but also guarantees the delivered image is exactly targetSize (must be set when a normalizedCropRect is specified)

Ответ 4

Вы можете использовать PHImageManagerMaximumSize как targetSize для запроса PHImageManager.

Согласно документам в PHImageManagerMaximumSize: Размер, который нужно передать при запросе исходного изображения или самого большого отображаемого изображения (resizeMode будет проигнорирован)