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

问题描述 投票:1回答:5

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

iphone cocoa-touch ipad
5个回答
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,以便它以低质量加载并通过下载进行改进。如果图像正常,则从上到下加载。


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,以便您可以在加载数据时执行某些操作。


1
投票

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

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

This site展示了一些例子。


1
投票

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


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];
© www.soinside.com 2019 - 2024. All rights reserved.