几个观察:
您的问题假定您尝试检索 NSData 的大小失败。他们不是。获取NSData 大小的正确方法是通过length。
不过,您的困惑源于一个错误的假设,即在通过UIImage 和UIImageJPEGRepresentation 的往返过程中获取外部生成的JPEG 将产生相同的NSData。这本来是极不可能的。有太多不同的 JPG 设置可以更改(请参阅JPEG Wikipedia page)。我们当然不知道原始文件使用了哪些设置。我知道UIImage 和/或UIImageJPEGRepresentation 改变了文件的色彩空间。我敢打赌它还会做很多其他事情。
所以你的结果是正确的。原始文件为 2.6mb,生成的文件为 4.5mb。如果将compressionQuality 从 1.0 更改为 0.99,则生成的文件只有 1.4mb!但是如果你想要原始文件,只需先保存它(就像我在下面做的那样)。
考虑以下代码,它下载图像文件,保存它,将其加载到UIImage,通过UIImageJPEGRepresentation 重新提取它,并保存图像的另一个副本:
// let's make filenames where we'll store the files
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *suncomboOrig = [documentsPath stringByAppendingPathExtension:@"suncombo1-orig.jpg"];
NSString *suncomboReprocessed = [documentsPath stringByAppendingPathExtension:@"suncombo1-reprocessed.jpg"];
// let's download the original suncombo1.jpg and save it in Documents and display the size
NSURL *url = [NSURL URLWithString:@"http://lasp.colorado.edu/home/wp-content/uploads/2011/03/suncombo1.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
NSLog(@"original = %d", [data length]);
[data writeToFile:suncomboOrig atomically:NO];
// let's load that into a UIImage
UIImage *image = [UIImage imageWithData:data];
// let's extract data out of the image and write that to Documents, too, also logging the size of that
NSData *data2 = UIImageJPEGRepresentation(image, 1.0);
NSLog(@"reprocessed = %d", [data2 length]);
[data2 writeToFile:suncomboReprocessed atomically:NO];
它的作用是报告:
2012-12-13 22:30:39.576 imageapp [90647:c07] 原始 = 2569128
2012-12-13 22:30:40.141 imageapp [90647:c07] 重新处理 = 4382876
所以我保存的第一个文件(我怀疑它与您服务器上的文件相同)是 2.5mb,在往返UIImage 并通过 4.3mb 重新提取后的文件。如果我查看上面代码保存的两个文件,我可以确认这些NSData 大小是正确的。
我最初的答案是基于这样的假设,即 OP 无法检索 NSData 的大小,或者这个简单问题背后存在一些微妙的问题(例如想要在下载开始之前获取大小) .无论如何,我已经在上面扩展了我的答案,但出于历史目的,我会保留我的原始答案:
原答案:
NSData 属性 length 告诉您下载了多少字节。例如。 [data2 length].
如果它真的很大,您可以使用NSURLConnection 异步下载它,这取决于您的Web 服务器,可能会在方法didReceiveResponse 中提供下载开始之前的总文件大小(使用expectedContentLength 属性在NSHTTPURLResponse *response 参数)。
NSURLConnection 下载的另一个好处是,您不必在下载时将整个文件加载到内存中,而是可以将其直接流式传输到持久存储,如果您'同时下载多个大文件。如果您正在下载大小合理的文件,使用NSURLConnection 下载是多余的,但在下载大文件并且您想要一个进度指示器(或者想要在下载开始之前获取文件大小)时它会很好。
但如果您只想知道有多少字节下载到您的NSData,请使用length。