Как получить размер UIImage в байтах в iOS 4.0+?

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

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

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

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

Любая помощь будет высоко оценена.

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

Ответ 1

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

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

int imageSize = imageData.length;
NSLog(@"SIZE OF IMAGE: %i ", imageSize);

Ответ 2

Я знаю, что это старый вопрос, но создание объекта 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:

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

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

Ответ 3

От: @fbrereto answer:

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

От: @Meet answer:

 UIImage *img = [UIImage imageNamed:@"sample.png"];
 NSData *imgData = UIImageJPEGRepresentation(img, 1.0); 
 NSLog(@"Size of Image(bytes):%d",[imgData length]);

Ответ 4

- (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];
   }
}