Размер 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) Результат Размер (1614,0,1678.0)
Несмотря на то, что я устанавливаю целевой размер 768x798 (в данном конкретном случае), получаемый в результате UIImage более чем вдвое больше. Теперь согласно документации, параметр targetSize
Msgstr "Целевой размер изображения для возврата."
Не самое ясное объяснение, но из моих экспериментов оно НЕ соответствует.
Если у вас есть предложения, я хотел бы услышать это!
4 ответа
В Swift
, вы хотите сделать что-то вроде этого:
var asset: PHAsset!
var imageSize = CGSize(width: 100, height: 100)
var options = PHImageRequestOptions()
options.resizeMode = PHImageRequestOptionsResizeMode.Exact
options.deliveryMode = PHImageRequestOptionsDeliveryMode.Opportunistic
PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: imageSize, contentMode: PHImageContentMode.AspectFill, options: options) {
(image, info) -> Void in
// what you want to do with the image here
var image = iImage(uiimage: uiimageResult)
println("Result Size Is \(uiimageResult.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, чтобы пользовательский интерфейс сначала загружал заполнитель низкого качества, а затем обновлял его, поскольку ОС может генерировать более качественное изображение (а не пустой квадрат).
Это потому что 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
Попробуйте установить resizeMode в PHImageRequestOptionsResizeModeExact
и deliveryMode to PHImageRequestOptionsDeliveryModeHighQualityFormat
;
PHImageRequestOptionsResizeModeExact,
// same as above but also guarantees the delivered image is exactly targetSize (must be set when a normalizedCropRect is specified)
Ты можешь использовать PHImageManagerMaximumSize
как targetSize
для PHImageManager
запрос.
Согласно документам в PHImageManagerMaximumSize
:Размер, который нужно передать при запросе исходного изображения или самого большого доступного изображения (resizeMode будет игнорироваться)