在iPhone中完全加载之前获取图像宽度和高度

时间:2011-06-24 13:50:08

标签: iphone objective-c nsurl

我正在使用

在我的UITableViewCell中加载图像
  

[NSData dataWithContentsOfURL:imageUrl]

为了设置我的tableview单元格的自定义高度,我需要正在加载的图像的实际大小。

我们可以在完全加载之前获得图像的宽度和高度吗?提前谢谢。

5 个答案:

答案 0 :(得分:8)

你可以这样做:

NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];
UIImage *image = [UIImage imageWithData:imageData];
NSLog(@"image height: %f",image.size.height);
NSLog(@"image width: %f",image.size.width); 

答案 1 :(得分:4)

NSData是一个“不透明”的数据,因此在将其转换为更“有用”的内容之前,您无法使用它(例如,通过它创建UIImage -initWithData:方法)。那时你可以查询图像大小,但对你来说会很晚。

我看到的唯一方法是,如果您在图像完全下载之前确实需要了解图像大小,那么就是实现最小的服务器端API,以便在尝试下载之前询问图像大小。

无论如何,为什么在实际下载之前需要知道图像大小?您是否可以在下载时设置行高(即,从您的请求委托方法)?

答案 2 :(得分:4)

看看这个问题How do I extract the width and height of a PNG from looking at the header in objective c,它分享如何解析图像元数据。

我有一个创建的OpenSource项目Ottran,它通过尽可能少的下载来提取远程图像的图像大小和类型,支持PNGJPEG,{{1} }和BMP格式。

答案 3 :(得分:2)

尝试Image I / O接口,如下所示。这样您就可以在不必加载整个文件的情况下获取图像大小:

#import <ImageIO/ImageIO.h>

NSMutableString *imageURL = [NSMutableString stringWithFormat:@"http://www.myimageurl.com/image.png"];

CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)[NSURL URLWithString:imageURL], NULL);
NSDictionary* imageHeader = (__bridge NSDictionary*) CGImageSourceCopyPropertiesAtIndex(source, 0, NULL);
NSLog(@"Image header %@",imageHeader);
NSLog(@"PixelHeight %@",[imageHeader objectForKey:@"PixelHeight"]);

答案 4 :(得分:0)

dataWithContentsOfURL是同步的,它会阻止你的用户界面,直到下载完成,所以请使用标题内容来获得解析,下面是 Swift 3.0 代码

 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)")
       }
   }