Отображение изображений для просмотра - PullRequest
1 голос
/ 02 февраля 2012

Я прохожу следующий учебник .Мне нужно, чтобы получить уменьшенные изображения большого изображения.В соответствии с руководством используется следующий метод.

CGImageRef MyCreateThumbnailImageFromData (NSData * data, int imageSize)

примечание: посмотрите учебник, если вам нужен полный код для этого метода

Мои вопросы:

1.) У меня есть URL http://www.myimage.com/smile.jpg, и мне нужно изменить его размер до миниатюры.Я не понимаю, что такое параметр NSData * data.Все, что у меня есть, это строковый URL.Итак, как я могу передать свой URL этому методу программно?

2.) Вышеуказанный метод возвращает CGImageRef Но мне нужен UIImage, чтобы я мог добавить его в UIIMageVIew и затем отобразить его в моем проекте.Так как же я могу использовать CGImageRef для отображения изображений в моем проекте?

3.) Загружаемые изображения очень большие, 2 МБ или больше.Сделав так, чтобы оно отображалось в размере миниатюр, уменьшит ли оно время, необходимое для загрузки изображения в представление?

Ответы [ 2 ]

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

Давайте пройдемся по шагам:

1) Объект NSData является оберткой для массива байтов, или char *.Это необработанные байты нужного вам изображения.

2) CGImageRef - это способ представления изображения CoreGraphics, который можно преобразовать в UIImage с помощью селектора +imageWithCGImage:,Вообще говоря, у вас есть более точный контроль над изображением с помощью CGImageRef.

3) Преобразование этих изображений в миниатюру не сократит время, необходимое для загрузки.Файл должен быть сначала загружен в память, прежде чем он будет преобразован.

Пример использования вашей функции:

int myImageSize = .... // do what you need to to figure out the size of the image
UIImage *myImage = [UIImage imageWithCGImage:MyCreateThumbnailImageFromData([NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.myimage.com/smile.jpg"]], myImageSize)];

Это, однако, заблокирует пользовательский интерфейс, рассмотрите возможность использования GCD или NSURLConnectionвместо -dataWithContentsOfURL:.

РЕДАКТИРОВАТЬ: Пример с GCD:

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    __block UIImage *myImage = [UIImage imageWithCGImage:MyCreateThumbnailImageFromData([NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.myimage.com/smile.jpg"]], myImageSize)];

    [myImageView performSelectorOnMainThread:@selector(setImage:) withObject:myImage waitUntilDone:NO];
});
0 голосов
/ 02 февраля 2012
NSData* theData = [NSData dataWithContentsOfURL:@"http://www.myimage.com/smile.jpg"];
UIImage *theImage = [[UIImage alloc] initWithData:data];

UIGraphicsBeginImageContext(CGSizeMake(128, 96));
[theImage drawInRect:CGRectMake(0.0, 0.0, 128, 96)];
UIImage *myThumbnail = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIImageView *myThumbnailView = [[UIImageView alloc] initWithImage:myThumbnail];

РЕДАКТИРОВАТЬ для асинхронного подхода:

в файле заголовка:

NSURLConnection* connection;
NSMutableData* data;

- (void)loadImageFromURL:(NSURL*)url;

в файле реализации:

NSURL *url = [NSURL URLWithString:@"http://www.myimage.com/smile.jpg"]];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

- (void)loadImageFromURL:(NSURL*)url {

    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(loadImageFromURL:) withObject:url waitUntilDone:NO];
        return;
    }
    if (connection!=nil) { [connection release]; }

    if (data!=nil) { [data release]; }

    NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

}

- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)incrementalData {
    if (data==nil) { data = [[NSMutableData alloc] initWithCapacity:4096]; } 
    [data appendData:incrementalData];
}



- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {

    [connection release];
    connection=nil;

    UIImage *theImage    = [[UIImage alloc] initWithData:data];

    UIGraphicsBeginImageContext(CGSizeMake(128, 96));
    [theImage drawInRect:CGRectMake(0.0, 0.0, 128, 96)];
    UIImage *myThumbnail = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIImageView *myThumbnailView = [[UIImageView alloc] initWithImage:myThumbnail];

    [data release];
    data=nil;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...