Как получить размер UIImage в байтах в iOS 4.0+? - PullRequest
11 голосов
/ 17 июня 2011

Я пытаюсь выбрать изображение из библиотеки фотографий или с камеры.
Метод делегата:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo

Дает мне объект UIImage. Мне нужно найти размер изображения в bytes для моего приложения.

Есть ли способ узнать тип файла изображения, а также размер в байтах?

Любая помощь будет принята с благодарностью.

Заранее спасибо

Ответы [ 4 ]

35 голосов
/ 17 июня 2011

Попробуйте следующий код:

NSData *imageData = [[NSData alloc] initWithData:UIImageJPEGRepresentation((image), 1.0)];

int imageSize = imageData.length;
NSLog(@"SIZE OF IMAGE: %i ", imageSize);
17 голосов
/ 20 декабря 2013

Я знаю, что это старый вопрос, но создание объекта NSData только для того, чтобы получить размер изображения в байтах, может быть очень дорогой операцией. Изображение может иметь размер более 20 МБ и создавать объекты одинакового размера, чтобы получить размер первого ...

Я склонен использовать эту категорию:

UIImage + CalculatedSize.h

#import <UIKit/UIKit.h>

@interface UIImage (CalculatedSize)

-(NSUInteger)calculatedSize;

@end

UIImage + CalculatedSize.m

#import "UIImage+CalculatedSize.h"

@implementation UIImage (CalculatedSize)

-(NSUInteger)calculatedSize
{    
    return CGImageGetHeight(self.CGImage) * CGImageGetBytesPerRow(self.CGImage);
}

@end

Вы просто импортируете UIImage+CalculatedSize.h и используете его так:

NSLog (@"myImage size is: %u",myImage.calculatedSize);

Или, если вы хотите избежать использования категорий:

NSUInteger imgSize  = CGImageGetHeight(anImage.CGImage) * CGImageGetBytesPerRow(anImage.CGImage);

EDIT:

Этот расчет, конечно, не имеет ничего общего со сжатием JPEG / PNG. Это относится к подложке CGimage :

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

Таким образом, размер, полученный таким образом, дает вам информацию о сценарии наихудшего случая без фактического создания дорогого дополнительного объекта.

2 голосов
/ 17 июня 2011

От: @ fbrereto ответ :

Базовые данные UIImage могут различаться, поэтому для одного и того же «изображения» могут быть данные разных размеров. Одна вещь, которую вы можете сделать, это использовать UIImagePNGRepresentation или UIImageJPEGRepresentation, чтобы получить эквивалентные конструкции NSData для любого из них, а затем проверить размер.

От: @ Встреча ответ :

 UIImage *img = [UIImage imageNamed:@"sample.png"];
 NSData *imgData = UIImageJPEGRepresentation(img, 1.0); 
 NSLog(@"Size of Image(bytes):%d",[imgData length]);
0 голосов
/ 21 сентября 2011
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)editInfo{
   UIImage *image=[editInfo valueForKey:UIImagePickerControllerOriginalImage];
   NSURL *imageURL=[editInfo valueForKey:UIImagePickerControllerReferenceURL];
   __block long long realSize;

   ALAssetsLibraryAssetForURLResultBlock resultBlock=^(ALAsset *asset)
   {
      ALAssetRepresentation *representation=[asset defaultRepresentation];
      realSize=[representation size];
   };

   ALAssetsLibraryAccessFailureBlock failureBlock=^(NSError *error)
   {
      NSLog(@"%@", [error localizedDescription]);
   };

   if(imageURL)
   {
      ALAssetsLibrary *assetsLibrary=[[[ALAssetsLibrary alloc] init] autorelease];
      [assetsLibrary assetForURL:imageURL resultBlock:resultBlock failureBlock:failureBlock];
   }
}
...