在将图像完全加载到iPhone之前获取图像的宽度和高度
我正在使用将图像加载到UITableViewCell中 [NSData dataWithContentsOfURL:imageUrl] 为了设置tableview单元格的自定义高度,我需要加载图像的实际大小 在完全加载之前,我们能得到图像的宽度和高度吗?提前感谢。在将图像完全加载到iPhone之前获取图像的宽度和高度,iphone,objective-c,nsurl,Iphone,Objective C,Nsurl,我正在使用将图像加载到UITableViewCell中 [NSData dataWithContentsOfURL:imageUrl] 为了设置tableview单元格的自定义高度,我需要加载图像的实际大小 在完全加载之前,我们能得到图像的宽度和高度吗?提前感谢。NSData是一种“不透明”数据,因此在将其转换为更“有用”的数据之前(例如,通过it-initWithData:方法创建UIImage)。在那一刻,你可以查询图像的大小,但它会为你迟到 如果您真的需要在完全下载图像之前知道图像大小,那
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,您将在浏览器中看到,它能够在加载时调整图像大小并加载部分图像。但是,在浏览器中调整大小之前,其他图像类型将完全加载。如果不需要大量的数据操作来查找尺寸,最好的办法是将图像大小存储在单独的介质中。这样你就可以在拉下图像之前获得这些信息。问题是“在完全加载之前”。效果很好!这应该是公认的答案。不要忘记源和头字典的内存管理。