如何获取由UIImagePickerController选中的图像文件大小?

9

我想知道由UIImagePickerController选择的IPhone相册中的图像文件大小。

我已经尝试了这段代码,使用了1,571,299字节的JPEG图像。

UIIamge *selectedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

NSData *imageData; 
if ( /* PNG IMAGE */ ) 
    imageData = UIImagePNGReprensentation(selectedImage);
else 
    imageData = UIImageJPEGReprensentation(selectedImage);

NSUInteger fileLength = [imageData length];

NSLog(@"file length : [%u]", fileLength);

但是当我运行这段代码时,它打印出362788字节。

有人知道这是为什么吗?


1
你确定else块会执行吗?这差别太大了。 - Akshay
但是你用于检查是否为PNG文件的条件已被注释掉。尝试通过注释if块来执行一次。 - Akshay
我检查了我的条件块,它正常工作。UIIamge *selectedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; NSData *imageDataPNG = UIImagePNGRepresentation(selectedImage); NSData *imageDataJPG = UIImageJPEGRepresentation(selectedImage, 1.0f); NSUInteger fileLengthPNG = [imageDataPNG length]; NSUInteger fileLengthJPG = [imageDataJPG length]; dLog(@"-->> fileSizePNG : [%u]", fileLengthPNG); dLog(@"-->> fileSizeJPG : [%u]", fileLengthJPG); 但输出结果如下。-->> fileSizePNG : [794372] -->> fileSizeJPG : [362788] - James.Jo
那种方法行不通,至少对于JPEG图像是这样的。你正在重新压缩图像,这不会产生原始文件大小。顺便问一下,你使用了什么压缩质量设置?UIImageJPEGRepresentation()函数需要两个参数。你上面的代码甚至无法编译。 - Ole Begemann
3个回答

6
如果您需要用代码拍照,请按照以下方式进行:
UIImagePickerController *controller = [[[UIImagePickerController alloc] init] autorelease];
controller.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
controller.delegate = self;
[self presentModalViewController:controller animated:YES];

然后,您可以通过以下方式检索所选图像的文件大小:

NSURL *assetURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"];
ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];
[library assetForURL:assetURL resultBlock:^(ALAsset *asset) {
    NSLog(@"Size: %lld", asset.defaultRepresentation.size);
} failureBlock:nil];

如果源类型是UIImagePickerControllerSourceTypeCamera,您必须在检索其文件大小之前将内存中的图像保存到磁盘上。

2

正如一些评论者所说,即使我们假设方法是正确的,您也将重新处理图像,因此字节大小将不匹配。对于JPG图像,我使用以下方法,对于PNG可能有所不同:

+ (NSInteger)bytesInImage:(UIImage *)image {
    CGImageRef imageRef = [image CGImage];
    return CGImageGetBytesPerRow(imageRef) * CGImageGetHeight(imageRef);    
}

如一位评论者所指出的那样,上述代码确实返回未压缩的大小信息。

这是未压缩的大小;看起来原始问题是原始压缩大小... - Adrian
好的观点!如果我能想到解决方案,我可能会修改答案。不过,我的第一个句子仍然是正确的。 - Diziet

0

这是Swift 4的代码

extension UIImage {

    var memorySize: Int {
        guard let imageRef = self.cgImage else { return 0 }
        return imageRef.bytesPerRow * imageRef.height
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接