加载低分辨率图像和高分辨率的渐进式加载

时间:2010-04-22 14:23:25

标签: iphone cocoa-touch ipad

如何在页面上显示低分辨率图像,然后在第二次延迟后加载高分辨率版本?这是用图层完成的吗?线程?

5 个答案:

答案 0 :(得分:3)

我知道这篇文章已经过时了,但万一有人正在寻找它,有一个名为NYXImagesKit的项目能够满足您的需求。

它有一个名为NYXProgressiveImageView的类,它是UIImageView的子类。

您所要做的就是:

NYXProgressiveImageView * imgv = [[NYXProgressiveImageView alloc] init];
imgv.frame = CGRectMake(0, 0, 320, 480);
[imgv loadImageAtURL:[NSURL URLWithString:@"http://yourimage"]];
[self.view addSubview:imgv];
[imgv release];

另外,一个不错的选择是将图像保存为interlaced,以便以低质量加载并通过下载进行改进。如果图像正常,则从上到下加载。

答案 1 :(得分:2)

有几种选择:

1)以支持渐进式下载(progressive JPEGinterlaced PNG)的格式将图像保存在服务器上。我想你必须得到客户的特别支持,即。将图像解码部分从PNG / JPEG写入UIImage自己,大概使用一些库。

2)在服务器上的每个图像上保存一个小缩略图。当您想要下载图像时,首先要下载缩略图,进行简单的缩放以将其拉伸到完整图像大小,同时下载完整版本。如果您真的想要获得幻想,可以有多种不同尺寸的缩略图。您将在服务器上获得更多数据,但客户端代码应该相当简单。

3)也许你已经在客户端上有缩略图了?在这种情况下,您可以将缩略图拉伸到完整图像大小,以便在加载其余图像时创建低分辨率版本。

如果你问的是如何准确编码第二个或第三个解决方案......你真的不需要显式线程,我不确定“层”在这个上下文中的意思。从网络加载UIImage非常简单,有点像这样:

 NSURL *url = [NSURL URLWithString:@"http://somewhere/foo.png"];
 NSURLRequest *request = [NSURLRequest requestWithURL:url];
 NSData *data = [NSURLConnection sendSynchronousRequest:request
    returningResponse:NULL error:NULL];
 UIImage *image = [UIImage imageWithData:data];

您可以将此代码转换为函数,加载并显示缩略图,然后加载并显示完整图像。所有这些都可以完成in background,这样您就可以在加载数据时执行某些操作。

答案 2 :(得分:1)

通常,此功能是通过以某种interlaced/progessive模式保存的图像文件实现的。这允许显示应用程序(即浏览器)在第一组数据到达时以低质量连续显示图像。可用的数据越多,图像质量就越高。

此功能独立于Web服务器。只有客户端应用程序负责支持此模式

This site显示了一些示例。

答案 3 :(得分:1)

这听起来像是在描述类似于Three20的TTPhotoViewController(在Facebook iPhone应用程序中使用)。当您第一次开始查看图像时,它只是一个已拉伸的缩略图。 “高分辨率”版本正在后台下载,当下载完成后,它将替换现有的拉伸图像。

答案 4 :(得分:0)

我可以使用afnetworking下载。我使用下面的代码

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath =  [[paths objectAtIndex:0] stringByAppendingPathComponent:@"tempPath"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"yourUrl"]];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    self.actualImage = [UIImage imageWithData:[NSData dataWithContentsOfFile:filePath]];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
    [imageView setImage:[UIImage imageWithData:[NSData dataWithContentsOfFile:filePath]]];
    self.actualImage = [UIImage imageWithData:[NSData dataWithContentsOfFile:filePath]];

}];

[operation start];