web-dev-qa-db-ja.com

iOS:URLから画像を読み込む

URLから画像を読み込み、UIImageView内に設定する必要があります。問題は、画像の正確なサイズがわからないということです。その後、どのように画像を正しく表示できますか?

51
CrazyDev

たとえば、UIImageのsizeプロパティを使用します。

NSURL *url = [NSURL URLWithString:path];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [[UIImage alloc] initWithData:data];
CGSize size = img.size;
114
fbernardo

Swiftの場合:

var url = NSURL.URLWithString("http://www.example.com/picture.png")
var data = NSData(contentsOfURL : url)
var image = UIImage(data : data)
image.size // if you need it
13
yegor256

Swiftオプションの使用に関して:

var url:NSURL? = NSURL(string: imageString)
var data:NSData? = NSData(contentsOfURL : url!)
var image = UIImage(data : data!)
9
DCDC

IN Swift 3.

メインスレッドは、ユーザーインターフェイスとユーザーインタラクションを提供するために、常にフリーのままにしておく必要があります。

class ViewController: UIViewController {

@IBOutlet weak var imageView: UIImageView!

private func fetchImage() {
    let imageURL = URL(string: "https://i.stack.imgur.com/9z6nS.png")
    var image: UIImage?
    if let url = imageURL {
        //All network operations has to run on different thread(not on main thread).
        DispatchQueue.global(qos: .userInitiated).async {
            let imageData = NSData(contentsOf: url)
            //All UI operations has to run on main thread.
            DispatchQueue.main.async {
                if imageData != nil {
                    image = UIImage(data: imageData as! Data)
                    self.imageView.image = image
                    self.imageView.sizeToFit()
                } else {
                    image = nil
                }
            }
        }
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    fetchImage()
}

}
7
Ashok R

Kingfisherライブラリで非同期イメージをダウンロードするには、次の手順に従ってください:url: https://github.com/onevcat/Kingfisher

 func imageFromUrl(_ urlString: String) {
        if let url = URL(string: urlString) {
            ImageDownloader.default.downloadImage(with: url, options: [], progressBlock: nil) {
                (image, error, url, data) in
                DispatchQueue.main.async {
                    self.imageView.image = image
                }
            }
        }
    }

デフォルトのURLSession.shared.dataTaskで画像をダウンロードすることもできます

 func imageFromUrl(_ urlString: String) {
        if let url = URL(string: urlString) {
            let request = URLRequest(url: url)
            URLSession.shared.dataTask(with: request) {(data,response,error) in
                if let imageData = data as Data? {
                    if let img = UIImage(data: imageData){
                       DispatchQueue.main.async {
                       self.imageView.image = img
                       }
                    }
                }
            }
        }
    }
1
Krishna Thakur

Jsonまたはurlからダウンロードした画像を表示する際のよくある間違いの1つは、キューの問題です。 UI関連のすべての処理はメインキューで行う必要があるため、これを忘れると、完璧なコード(上記の答えは良い)でさえ時々画像が表示されません。 mainQueueを呼び出すには、次のようなコードを使用し、呼び出されたimageDisplay関数でメインキューの呼び出しを個別に行う必要があることに注意してください。

dispatch_async(dispatch_get_main_queue(), ^{

    self.nameLabel.text = self.pokemon.name;

    [self displayImage];  //CALLS FUNCTION
    self.abilitiesTextView.text = @"loves SwiftUI";
});

- (void)displayImage {            

    NSString *imageURLString = [NSString stringWithFormat: self.pokemon.Sprite];
    NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imageURLString]];
    dispatch_async(dispatch_get_main_queue(), ^{
        self.spriteImageView.image = [UIImage  imageWithData: imageData];
    });

    // NOTE: important for newer versions of XCode/Obj-C...
    //[imageData release];   With ARC ("automated release..."), release method is forbidden, it's already done for you.
}
0
Jack Pitts

Swift 5.0 +バックグラウンドでフェッチ

private func fetchImage(_ photoURL: URL?) {

    guard let imageURL = photoURL else { return  }

    DispatchQueue.global(qos: .userInitiated).async {
        do{
            let imageData: Data = try Data(contentsOf: imageURL)

            DispatchQueue.main.async {
                let image = UIImage(data: imageData)
                self.userImageView.image = image
                self.userImageView.sizeToFit()
                self.tableView.reloadData()
            }
        }catch{
            print("Unable to load data: \(error)")
        }
    }
}
0
Bary Levy