Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在将图像完全加载到iPhone之前获取图像的宽度和高度_Iphone_Objective C_Nsurl - Fatal编程技术网

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

在将图像完全加载到iPhone之前获取图像的宽度和高度,iphone,objective-c,nsurl,Iphone,Objective C,Nsurl,我正在使用将图像加载到UITableViewCell中 [NSData dataWithContentsOfURL:imageUrl] 为了设置tableview单元格的自定义高度,我需要加载图像的实际大小 在完全加载之前,我们能得到图像的宽度和高度吗?提前感谢。NSData是一种“不透明”数据,因此在将其转换为更“有用”的数据之前(例如,通过it-initWithData:方法创建UIImage)。在那一刻,你可以查询图像的大小,但它会为你迟到 如果您真的需要在完全下载图像之前知道图像大小,那

我正在使用将图像加载到UITableViewCell中

[NSData dataWithContentsOfURL:imageUrl]

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

在完全加载之前,我们能得到图像的宽度和高度吗?提前感谢。

NSData
是一种“不透明”数据,因此在将其转换为更“有用”的数据之前(例如,通过it
-initWithData:
方法创建
UIImage
)。在那一刻,你可以查询图像的大小,但它会为你迟到

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


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

您可以这样做:

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

看看这个问题,它分享了如何解析图像元数据


我创建了一个开源项目,通过尽可能少的下载来提取远程图像的图像大小和类型,该项目支持
PNG
JPEG
BMP
GIF
格式。

尝试如下所述的图像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"]);
#导入
NSMutableString*图像URL=[NSMutableString stringWithFormat:@”http://www.myimageurl.com/image.png"];
CGImageSourceRef source=CGImageSourceCreateWithURL((CFURLRef)[NSURL URLWithString:imageURL],NULL);
NSDictionary*imageHeader=(\uu桥NSDictionary*)CGImageSourceCopyPropertiesAtIndex(源,0,NULL);
NSLog(@“图像头%@”,图像头);
NSLog(@“PixelHeight%@,[imageHeader objectForKey:@“PixelHeight]”);

dataWithContentsOfURL
是同步的,它将阻止您的UI,直到其下载完成,因此请使用标题内容获得解决方案,下面是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)")
       }
   }

我不确定——但我会假设,基于浏览器加载图像的方式,不同类型的图像具有不同的元数据来描述其维度。如果您曾经加载过大型JPG,您将在浏览器中看到,它能够在加载时调整图像大小并加载部分图像。但是,在浏览器中调整大小之前,其他图像类型将完全加载。如果不需要大量的数据操作来查找尺寸,最好的办法是将图像大小存储在单独的介质中。这样你就可以在拉下图像之前获得这些信息。问题是“在完全加载之前”。效果很好!这应该是公认的答案。不要忘记源和头字典的内存管理。