如何在iOS 4.0+中以字节为单位获取UIImage的大小?

时间:2011-06-17 11:51:00

标签: iphone ios objective-c uiimageview uiimage

我正在尝试从照片库或相机中挑选图像。
代表方法:

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

给我UIImage个对象。我需要在bytes中为我的应用程序找到图像的大小。

有什么方法可以获取图像的文件类型以及字节大小?

任何形式的帮助都将受到高度赞赏。

提前致谢

4 个答案:

答案 0 :(得分:35)

请尝试以下代码:

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

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

答案 1 :(得分:17)

我知道这是一个老问题,但创建一个NSData对象只是为了获取图像的字节大小可能是一个非常昂贵的操作。图像可以有超过20Mb并创建相同大小的对象,只是为了获得第一个的大小......

我倾向于使用这个类别:

<强>的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);

修改

此计算当然与JPEG / PNG压缩无关。它涉及底层CGimage

  

位图(或采样)图像是像素的矩形阵列,具有   每个像素代表源中的单个样本或数据点   图像。

在某种程度上,以这种方式检索的大小可以为您提供最坏情况的方案信息,而无需实际创建昂贵的附加对象。

答案 2 :(得分:2)

来自:@fbreretoanswer

UIImage的基础数据可能会有所不同,因此对于相同的“图像”,可能会有不同大小的数据。您可以做的一件事是使用UIImagePNGRepresentationUIImageJPEGRepresentation来获取两者的等效NSData结构,然后检查其大小。

来自:@Meetanswer

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

答案 3 :(得分:0)

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