Загрузка изображения с низким разрешением и прогрессивная загрузка с высоким разрешением - PullRequest
1 голос
/ 22 апреля 2010

Как отобразить изображение с низким разрешением на странице, а затем через секунду загрузить версию с высоким разрешением?Это сделано со слоями?Темы

Ответы [ 5 ]

3 голосов
/ 07 февраля 2012

Я знаю, что этот пост старый, но на тот случай, если его кто-то ищет, есть проект под названием 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 голосов
/ 22 апреля 2010

Есть несколько вариантов:

1) Сохраните изображения на сервере в формате, поддерживающем прогрессивную загрузку ( прогрессивный JPEG , чересстрочный 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];

Вы можете превратить этот код в функцию, загрузить и отобразить миниатюру, а затем загрузить и отобразить полное изображение. Все это можно сделать в фоновом режиме , чтобы вы могли что-то сделать во время загрузки данных.

1 голос
/ 22 апреля 2010

Похоже, вы описываете что-то вроде TTPhotoViewController от Three20 (используется в приложении Facebook для iPhone).Когда вы впервые начинаете смотреть на изображение, это просто эскиз, который был растянут.Версия в высоком разрешении загружается в фоновом режиме, и после завершения загрузки она заменяет существующее растянутое изображение.

1 голос
/ 22 апреля 2010

Как правило, эта функция достигается с помощью файлов изображений, сохраненных в режиме чересстрочный / прогестивный .Это позволяет отображающему приложению (т.е. браузеру) отображать изображение последовательно, начиная с низкого качества, когда поступают первые порции данных.Чем больше данных доступно, тем выше качество изображения.

Эта функция не зависит от веб-сервера.Только клиентское приложение отвечает за поддержку этого режима

Этот сайт показывает несколько примеров.

0 голосов
/ 01 ноября 2013

Мне удалось загрузить с помощью 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...