gpt4 book ai didi

iphone - 在IOS中找出下载的图像文件大小

转载 作者:可可西里 更新时间:2023-11-01 05:04:05 28 4
gpt4 key购买 nike

您好,我想运行一个线程并检查当前下载的文件大小。

这是我用的

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://lasp.colorado.edu/home/wp-content/uploads/2011/03/suncombo1.jpg"]]];

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSString *jpegFilePath = [NSString stringWithFormat:@"%@/test.jpeg",docDir];
NSData *data2 = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0f)];//1.0f = 100% quality
[data2 writeToFile:jpegFilePath atomically:YES];
downloadStatus.text =[NSString stringWithFormat:@"size: %zd", malloc_size(data2)];

[image release];

我也曾尝试将 malloc_size(data2) 更改为图像,但这又不是真正的结果。我知道这没有线程并且在下载过程中不检查但是我应该在这里使用什么来查看文件大小?

最佳答案

一些观察:

  1. 您的问题假定您尝试检索 NSData 的大小失败。他们不是。获取 NSData 大小的正确方法是通过 length

  2. 不过,您的困惑源于一个错误的假设,即通过 UIImageUIImageJPEGRepresentation 往返获取外部生成的 JPEG 会产生相同的 NS数据。这是极不可能的。有太多不同的 JPG 设置可以更改(请参阅 JPEG Wikipedia page )。我们当然不知道原始文件使用了什么设置。我知道 UIImage 和/或 UIImageJPEGRepresentation 改变了文件的颜色空间。我敢打赌它还会做很多其他事情。

  3. 所以你的结果是正确的。原始文件为 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] original = 25691282012-12-13 22:30:40.141 imageapp[90647:c07] reprocessed = 4382876

因此,我保存的第一个文件(我怀疑它与您服务器上的文件相同)为 2.5mb,在往返 UIImage 并通过 4.3mb 重新提取后的文件。如果我查看上面代码保存的两个文件,我可以确认这些 NSData 大小是正确的。


我最初的回答是基于这样的假设,即 OP 无法检索 NSData 的大小,或者简单问题背后存在一些微妙的问题(例如想要获取大小下载开始之前)。无论如何,我已经在上面扩展了我的答案,但出于历史目的,我会保留我原来的答案:

原答案:

NSData 属性 length告诉您下载了多少字节。例如。 [data2 长度]

如果真的很大,可以用NSURLConnection异步下载它,这取决于您的 Web 服务器,可能会在下载开始之前提供总文件大小 didReceiveResponse (使用 NSHTTPURLResponse *response 参数中的 expectedContentLength 属性)。

NSURLConnection 下载的另一个好处是,您不必在下载时将整个文件加载到内存中,而是可以将其直接流式传输到持久性存储,这如果您同时下载多个大文件,此功能特别有用。如果你正在下载一个大小合理的文件,使用 NSURLConnection 来下载是多余的,但是当你下载大文件并且你想要一个进度指示器(或者想要在下载之前获取文件大小)时它会很好开始)。

但如果您只想知道有多少字节被下载到您的 NSData,请使用 length

关于iphone - 在IOS中找出下载的图像文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13871141/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com