Установить максимальный размер для CGImageRef из ALAssetRepresentation - PullRequest
3 голосов
/ 12 января 2012

В настоящее время я использую следующий код для получения UIImage из ALAsset в приложении iOS.

ALAssetRepresentation *rep = [self.asset defaultRepresentation];
CGImageRef ref = [rep fullResolutionImage];
ALAssetOrientation orientation = [[self.asset valueForProperty:@"ALAssetPropertyOrientation"] intValue];
UIImage *image = [UIImage imageWithCGImage:ref scale:1.0 orientation:(UIImageOrientation)orientation];

Это работает очень хорошо, если изображение достаточно маленькое (например, снято на камеру устройства). Однако если изображение слишком большое (6000px ^ 2 и более), приложению не хватит памяти на этом этапе:

CGImageRef ref = [rep fullResolutionImage];

Я хотел бы обнаружить это условие до сбоя приложения или (в идеале) установить максимальный размер возвращаемого изображения.

Мне известно, что fullScreenImage вернет меньшее изображение, однако для масштабирования приложению требуется гораздо более высокое разрешение по сравнению с изображением.

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

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

1 Ответ

2 голосов
/ 13 января 2012

ОБНОВЛЕНИЕ:

После некоторого обсуждения в комментариях.

Вы можете получить информацию об Exif файлах / активах с помощью вызова

[asset metadata]

Ссылка, которую я нашел, -здесь sarofox.alasset-image-metadata На странице также показано, как получить отдельные свойства.Это должно позволить вам получить размеры в пикселях до того, как вы откроете файл / ресурс.

МОЙ СТАРЫЙ ОТВЕТ:

ниже, в случае, если кто-то посчитает эту идею полезной .:

Это всего лишь предположение.Но не могли бы вы использовать ALAssetRepresentation getBytes: fromOffset: length: error:

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

Запустите проверку с помощью fromOffset с начала размера файла.И длина до (желаемого максимального) конца размера файла.

Считайте размер в буфере.Если он меньше, чем запрос, то все в порядке.Если он в точности совпадает с запрошенным диапазоном, то в файле может остаться больше (возможно, больше).

Если это так, выполните новый запрос getBytes: fromOffset: length: error:* на этот раз с параметром fromOffset из длины последнего запроса и новой длины.

Затем можно сложить результаты и определить, будет ли весь файл слишком большим.

Но никогда не используйте слишком большой буфер / файл

...