2012-02-02 24 views
1

私は次のものを試していますtutorial。私は大きな画像のサムネイル画像を取得する必要があります。チュートリアルによると、次の方法でそれを行います。ビューに画像を表示する

CGImageRef MyCreateThumbnailImageFromData (NSData * data, int imageSize) 

注:このメソッドの完全なコードが必要な場合は、チュートリアルを見て

私の質問されています。

1.)URLはhttp://www.myimage.com/smile.jpgです。サムネイルにサイズ変更する必要があります。私は、NSData * dataパラメータが何であるかを突き止めないでください。私が持っているものはすべてString URLです。では、どうすれば私のURLをプログラムでこのメソッドに渡すことができますか?

2.)上記のメソッドはCGImageRefを返しますが、UIIMageVIewに追加してプロジェクトに表示できるように、UIImageが必要です。だから私はCGImageRefを使って自分のプロジェクトに画像を表示できますか?

3.)私がダウンロードしているイメージは2MB以上と非常に大きくなっています。それをサムネイルサイズで表示すると、画像をビューにロードするのにかかる時間が短縮されますか?

+0

1&2は分かりやすいプログラミング問題ですが、#3は大きな問題です。サイズを変更するにはダウンロードする必要がありますが、サムネイルのサイズを変更するだけの理由で2MBをダウンロードするのはなぜですか?代わりにサーバー側で行うか、サービスプロキシを作成してキャッシュします。 – bryanmac

答えて

3

は、この介してステップバイステップに行くことができます:

1)NSDataオブジェクトは、バイト配列、またはchar *のラッパーです。これは必要なイメージの生のバイトです。

2)CGImageRefCoreGraphicsの画像の表現方法であり、+imageWithCGImage:UIImageに変換することができます。一般的には、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)]; 

これは、しかし、代わりに-dataWithContentsOfURL:のGCDまたはNSURLConnectionを使用することを検討して、ユーザーインターフェイスをブロックします。

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

上記の質問では、著者は、-dataWithContentsOfURL:の代わりに 'GCDまたはNSURLConnectionを使用するように言います。だから私はあなたのコードでそれを行うことができますか? – shajem

+0

http://www.markj.net/iphone-asynchronous-table-image/を参照して、データを取得するための非同期アプローチを確認してください。 – ader

+0

ええ、私はそれを通過しました。サンプルプロジェクトは実行されませんでした – shajem

関連する問題