我正在尝试从照片库或相机中挑选图像。
代表方法:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
给我UIImage
个对象。我需要在bytes
中为我的应用程序找到图像的大小。
有什么方法可以获取图像的文件类型以及字节大小?
任何形式的帮助都将受到高度赞赏。
提前致谢
答案 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)
UIImage
的基础数据可能会有所不同,因此对于相同的“图像”,可能会有不同大小的数据。您可以做的一件事是使用UIImagePNGRepresentation
或UIImageJPEGRepresentation
来获取两者的等效NSData
结构,然后检查其大小。
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];
}
}