前言
最近做项目遇到一个需求:
- 单张图片的情况下,根据图片实际宽高比来展示图片,而不是展示正方形.
- 服务器没有返回图片宽高给app端
效果图
需求分析
很明确,需要我们自己根据URL去获取图片的相关信息
解决方案
- 将图片下载到本地然后获取图片的宽和高
- 其他获取图片信息的方案
方案优缺点
- 第一种方案缺点很明显,耗时并且影响性能,不推荐.(我面试过一家公司就采取的这个方案 ,加载很慢,有点得不偿失的感觉)
- 方案都还没呢,怎么办?
第二种方案
google 到了解决方案,使用ImageIO
框架,它可以根据图片的URL地址获取到图片的相关信息
#import <ImageIO/ImageIO.h>
NSMutableString *imageURL = [NSMutableString stringWithFormat:@"http://upload-images.jianshu.io/upload_images/4790717-5e4bb86d1ae712e8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"];
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"]);
打印结果:
Image header {
ColorModel = RGB;
Depth = 8;
HasAlpha = 1;
PixelHeight = 1136;
PixelWidth = 640;
ProfileName = "sRGB IEC61966-2.1";
"{PNG}" = {
Chromaticities = (
"0.3127",
"0.329",
"0.64",
"0.33",
"0.3",
"0.6000000000000001",
"0.15",
"0.06"
);
Gamma = "0.45455";
InterlaceType = 0;
};
}
这里我们只需要获取图片的 PixelHeight
和 PixelWidth
就好了
总结
- 第二种方案明显比第一种效率要高,但也是从服务器获取图片信息的,并不是十分推荐采取这种方法
- 如果可以的话,推荐让后台返回图片的宽高吧,或者和后台沟通传图片的时候,app端在上传图片的时候,把图片的宽和高一并传上去