web-dev-qa-db-ja.com

ダウンロードせずにURLから画像の幅と高さを取得する方法は?

セル内の画像を表示するためにSDWebImageを使用しています。しかし、私が以下のコードで行っているのは、UImageViewのフレームに完全に一致しています。

NSString * s =[NSString stringWithFormat:@"url of image to show"];
        NSURL *url = [NSURL URLWithString:s];
        [cell.shopImageView sd_setImageWithURL:url];

私のUIImageViewのサイズは50x50です。

たとえば、URLの画像のサイズは990x2100で、指定されたフレームで画像がうまく表示されません。この場合、高さが大きい場合は、幅50に一致するように適切な高さの比率で画像のサイズを変更します。

ダウンロードしたりメモリを割り当てたりせずに、URLから画像のサイズを確認する方法はありますか?

13
Łukasz Szpyrka

このデータはURLヘッダーから取得できますSwift 3.以下のコードを使用してください

 if let imageSource = CGImageSourceCreateWithURL(url! as CFURL, nil) {
     if let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as Dictionary? {
          let pixelWidth = imageProperties[kCGImagePropertyPixelWidth] as! Int
          let pixelHeight = imageProperties[kCGImagePropertyPixelHeight] as! Int
          print("the image width is: \(pixelWidth)")
          print("the image height is: \(pixelHeight)")
       }
   }
12
arunjos007

さまざまなcontentModeオプションをいじって、必要な外観を取得してください。一例はcell.shopImageView.contentMode = UIViewContentModeScaleAspectFit;これにより、画像が適切にフィットしますが、実際には画像ビューのサイズは変更されません。

ContentModeオプションは次のとおりです。 IViewContentModes

代替案は、これに沿ったものである可能性があります。

NSData *data = [[NSData alloc]initWithContentsOfURL:URL]; UIImage *image = [[UIImage alloc]initWithData:data]; CGFloat height = image.size.height; CGFloat width = image.size.width;

次に、画像の高さ/幅の比率に応じて、imageViewの高さ/幅を設定できます。

7
chetem
  • 画像をダウンロードせずにURLから画像のサイズを取得する方法がわかりません。

  • ただし、画像のダウンロード後にUIImageViewフレームを比例的に作成するためのコードスニペットを提供できます。

    NSData *data = [[NSData alloc]initWithContentsOfURL:URL]; // -- avoid this.
    
  • 上記の方法を使用して画像をダウンロードすると、UIがブロックされます。ですから避けてください。

    [cell.shopImageView ....]; // -- avoid this method.
    
  • SDWebImageを使用しているので、最初に画像をダウンロードするための専用のメソッドがいくつかあると思います。したがって、上記で使用したUIImageViewカテゴリメソッドを使用する代わりに、そのメソッドを使用して画像をダウンロードできます。

  • 画像をダウンロードした後。以下のようなものを試してください。

  • コードスニペット

  • 画像がダウンロードされ、オブジェクトが「theImage」であり、セルのimageviewとして「imageView」であると想定します。

    float imageRatio = theImage.size.width/theImage.size.height;
    float widthWithMaxHeight = imageView.frame.size.height * imageRatio;
    float finalWidth, finalHeight;
    if (widthWithMaxHeight > imageView.frame.size.width) {
        finalWidth = imageView.frame.size.width;
        finalHeight = imageView.frame.size.width/imageRatio;
    } else {
        finalHeight = imageView.frame.size.height;
        finalWidth = imageView.frame.size.height * imageRatio;
    }
    
    [imageView setFrame:CGRectMake(xOffset, yOffset, finalWidth, finalHeight)];
    [imageView setImage:theImage];
    
1
raja
 let ImageArray =  ((arrFeedData[indexPath.row] as AnyObject).value(forKey: "social_media_images") as? NSArray)!
 var ImageURL: String =  ((ImageArray[0] as AnyObject) as? String)!
 ImageURL = ImageURL.addingPercentEscapes(using: String.Encoding.ascii)!
   let imageUrl = URL(string: ImageURL)
   let imageData = try Data(contentsOf: imageUrl!)
    let image = UIImage(data: imageData)
print("image height: \(image?.size.height)"
  print("image Width: \(image?.size.width)")
1
deepak vaishnav