有些时候我们会有这样的一些需求:需要获得一张图片的具体尺寸和所占的存储空间,这张图片可能来自网络、本地,也可能是在内存当中的UIImage对象。
基本思路:图片文件的本质是一些二进制数据,他们按照一定的规则存储在磁盘或内存当中,我们只需要在相应的位置取出我们需要的数据即可。不同格式的图片存储方式不同,数据所在的位置也不同,所幸的是前人已经帮我们做好了封装,我们只需要调用相关API即可。针对图片文件的大小,我们还可以通过计算数据的长度的方式来计算。
网络图片和本地图片
对于计算机系统而言,本地和网络都是计算机系统外部某个位置,所以这两种存储方式的方法是一致的。
图片的尺寸
//需导入头文件#import <ImageIO/ImageIO.h>
- (CGSize)getImageSizeWithURL:(NSURL *)url
{
NSURL * mUrl = nil;
if ([url isKindOfClass:[NSURL class]]) {
mUrl = url;
}
if (!mUrl) {
return CGSizeZero;
}
CGFloat width = 0, height = 0;
CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((CFURLRef)mUrl, NULL);
if (imageSourceRef) {
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef, 0, NULL);
if (imageProperties != NULL) {
CFNumberRef widthNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
if (widthNumberRef != NULL) {
CFNumberGetValue(widthNumberRef, kCFNumberFloat64Type, &width);
}
CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
if (heightNumberRef != NULL) {
CFNumberGetValue(heightNumberRef, kCFNumberFloat64Type, &height);
}
CFRelease(imageProperties);
}
CFRelease(imageSourceRef);
}
return CGSizeMake(width, height);
}
图片大小
//需导入头文件#import <ImageIO/ImageIO.h>
- (CGFloat)getImageFileSizeWithURL:(NSURL *)url
{
NSURL *mUrl = nil;
if ([url isKindOfClass:[NSURL class]]) {
mUrl = url;
}
if (!mUrl) {
return 0.0f;
}
CGFloat fileSize = 0;
CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((CFURLRef)mUrl, NULL);
if (imageSourceRef) {
CFDictionaryRef imageProperties = CGImageSourceCopyProperties(imageSourceRef, NULL);
if (imageProperties != NULL) {
CFNumberRef fileSizeNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyFileSize);
if (fileSizeNumberRef != NULL) {
CFNumberGetValue(fileSizeNumberRef, kCFNumberFloat64Type, &fileSize);
}
CFRelease(imageProperties);
}
CFRelease(imageSourceRef);
}
return fileSize;
}
内存当中的UIImage对象
图片尺寸
UIImage *tempImage = [UIImage imageNamed:@"paperPlane"];
NSLog(@"imageSize:%f,%f",tempImage.size.width,tempImage.size.height);
图片大小
UIImage *tempImage = [UIImage imageNamed:@"paperPlane"];
NSData *imageData = UIImagePNGRepresentation(tempImage);
NSLog(@"imageFileSize:%ld",(long)imageData.length);
其他
网络和本地图片也可以通过IO读入计算,但需要拿到图片的全部数据,不推荐。