2012-02-02 4 views
1

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

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 МБ или более. Из-за того, что он отображается в миниатюре, уменьшит ли время загрузки изображения на вид?

+0

1 и 2 - это просто проблемы с программированием, которые вы выясните, но № 3 - большая проблема - вам нужно загрузить его, чтобы изменить его размер, но зачем загружать 2 МБ на телефоне, чтобы изменить его размер до миниатюры? Вместо этого сделайте это на стороне сервера или создайте прокси-сервер службы, чтобы сделать это, и кешируйте его. – bryanmac

ответ

3

Позволяет пройти через это, шаг за шагом:

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)]; 

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

EDIT: Пример с НОД:

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]; 
}); 
+1

Для # 3 рассмотрите возможность сделать это на стороне сервера или создать сервис, если это возможно, в кэше. – bryanmac

+0

Правда, но это не то, что задают в OP. Я согласен с тем, как он пытается это сделать, немного неуклюже, но я работал с тем, что мне давали. –

+0

+1 - имеет смысл.Просто хотел добавить ответ. Не уверен, что это вариант для него ... – bryanmac

0
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]; 

EDIT для асинхронного подхода:

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

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; 
} 
+0

В вышеприведенном вопросе автор говорит использовать 'GCD или NSURLConnection вместо -dataWithContentsOfURL:'. Итак, как я могу это сделать в вашем коде? – shajem

+0

Ознакомьтесь с http://www.markj.net/iphone-asynchronous-table-image/ для асинхронного подхода к получению данных. – ader

+0

Да, я прошел через него. образец проекта даже не запускался – shajem

Смежные вопросы