web-dev-qa-db-ja.com

iOSでURLを使用してUIImageを作成する

画像ファイルでUiImageを作成するには、次のコードを使用します。

UIImage *aImage = [[UIImage imageNamed:@"demo.jpg"]autorelease];

URL http://example.com/demo.jpg でUiImageを作成したい場合、どうすればいいですか?

ありがとう

更新

enter image description here

47
Charles Yeung

これは3段階のプロセスです。まず、アクセスしようとしているURLを保持するNSURLオブジェクトを作成します。このURLをNSDataクラスメソッド、+dataWithContentsOfURL:ネットワーク経由で生データとして画像を取得し、+imageWithData:データを画像に変換するUIImageのクラスメソッド。

NSURL *imageURL = [NSURL URLWithString:@"http://example.com/demo.jpg"];
NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
UIImage *image = [UIImage imageWithData:imageData];

その点に注意してください +dataWithContentsOfURL:は、同期ネットワーク要求を実行します。これをメインスレッドで実行すると、ネットワークから画像データを受信するまでUIがブロックされます。ベストプラクティスは、バックグラウンドスレッドでネットワークコードを実行することです。 OS 4.0+をターゲットにしている場合、次のようなことができます...

NSURL *imageURL = [NSURL URLWithString:@"http://example.com/demo.jpg"];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];

    dispatch_async(dispatch_get_main_queue(), ^{
        // Update the UI
        self.imageView.image = [UIImage imageWithData:imageData];
    });
});
152
Mark Adams

Swiftで同じコードがどのように見えるかを次に示します。

let image_url = NSURL("http://i.imgur.com/3yY2qdu.jpg")

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
    // do some task
    let image_data = NSData(contentsOfURL: image_url!)

    dispatch_async(dispatch_get_main_queue()) {
        // update some UI
        let image = UIImage(data: image_data!)
        self.imageView.image = image
    }
}
7
Dave Kiss

Webから画像をロードする場合は、次のライブラリが役立ちます。

https://github.com/rs/SDWebImage

これは、非同期ロードとURLからの画像キャッシュを処理するUIImageViewカテゴリーです。

0
vir us