2015-06-20 148 views
5

mM应用程序从我的Parse.com后端下载一些新图像。示例代码:从Parse.com下载图像并检查图像未损坏

//Where object is a downloaded PFObject 
PFFile *image = object[@"image"]; 
[image getDataInBackgroundWithBlock:^(NSData *data, NSError *error) { 

    if(!error) { 
     UIImage *image = [UIImage imageWithData:data]; 
     //Do more work here… 
    } 
} 

不过,我已经注意到,如果没有与连接或某种一般性错误的图像将被下载的(没有错误)问题,但图像将与黑色锯齿线和被扭曲不完整。有没有办法检查下载的图像是否完整无损并且不失真?

+0

可能是一个解析错误 – Alistra

+0

也想知道这个问题,有一半的图像会下载,所以下半部分会是黑色的问题。或者图像看起来像是有一个奇怪的黄色过滤器。在Parse 1.7.5上遇到这个问题 – Drenguin

回答

0

我以前也有这个问题,我检查一个标题,并将Content-Length与完成下载的数据进行比较。

如果Web服务器正常工作并且可以返回Content-Length的正确响应,您可以使用它来检查数据。

这里是下载请求只有头一个片段:

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease]; 
request.HTTPMethod = @"HEAD"; 
NSHTTPURLResponse *response; 
[NSURLConnection sendSynchronousRequest:request 
        returningResponse:&response 
           error:nil]; 

if ([response respondsToSelector:@selector(allHeaderFields)]) { 
    NSDictionary header = [response allHeaderFields]; 
    NSString *rawContentLength = [header objectForKey:@"Content-Length"]; 
    NSNumber *contentLength = [NSNumber numberWithInt:[rawContentLength intValue]]; 
    // Convert contentLength to NSUInteger and use to compare with you NSData length. 
} 

你也可以NSHTTPURLResponse使用它,你用它来下载图像,以节省HTTP请求。

接下来是获取NSData的长度。您可以使用方法:

NSUInteger dataLength = [downloadedData length]; 

然后比较这两个值,如果两个长度相等,其下载完成,否则你就需要重新下载。

您还可以通过读取Content-Type标题并检查数据的第一个字节和最后一个字节来检查图像是否已损坏。

对于PNG How to check if downloaded PNG image is corrupt? 不要忘记将“字节”转换为“char”,无论如何你都会看到警告。

对于JPEG Catching error: Corrupt JPEG data: premature end of data segment

希望这可以帮助你。 :)

+0

尽管解析了什么? – Kex

+0

我明白了,我们有同样的问题,但不同的工具。你可以检查**数据**内**如果**之前** imageWithData **?在这种情况下,如果您知道图像类型,您仍然可以检查图像数据是否损坏。如果图像已损坏,则可以重新下载。我想我会删除关于检查头中Content-Length的答案,因为它在这里不起作用。 – spicydog