我正在使用
在我的UITableViewCell中加载图像[NSData dataWithContentsOfURL:imageUrl]
为了设置我的tableview单元格的自定义高度,我需要正在加载的图像的实际大小。
我们可以在完全加载之前获得图像的宽度和高度吗?提前谢谢。
答案 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
,它通过尽可能少的下载来提取远程图像的图像大小和类型,支持PNG
,JPEG
,{{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)")
}
}