有時您可能想要從圖像文件中檢索某些屬性好乐,例如圖像的尺寸或其他元數(shù)據诈茧,而不會在屏幕上實際顯示全尺寸圖像叠荠。在iOS上最簡單的方法是使用UIImage
NSString *path = [[NSBundle mainBundle] pathForResource:@"KAR_5160" ofType:@"jpg"];
UIImage *image = [UIImage imageWithContentsOfFile:path];
NSLog(@"%@", NSStringFromCGSize(image.size));
這種方法的問題是整個圖像被加載到內存中墓拜。而且由于像素數(shù)據未被壓縮存儲在存儲器中潮售,所以即使是512×512像素(填滿不到iPhone 4屏幕的一半)也將占用1 MB的內存蚁飒。
CGImageSource
從iOS 4開始动壤,SDK包含了CGImageSource...
一整套功能的更好的解決方案,這些功能永遠都可以在Mac上使用淮逻。這些功能允許您訪問某些圖像元數(shù)據琼懊,而無需將實際像素數(shù)據加載到內存中。例如爬早,獲取像素尺寸的工作原理如下(確保在您的目標中包含ImageIO.framework
):
#import <ImageIO/ImageIO.h>
NSString *path = [[NSBundle mainBundle] pathForResource:@"KAR_5160" ofType:@"jpg"];
//
// UIImage *image = [UIImage imageWithContentsOfFile:path];
// NSLog(@"%@", NSStringFromCGSize(image.size));
NSURL *imageFileURL = [NSURL fileURLWithPath:path];
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)imageFileURL, NULL);
if (imageSource == NULL) {
// 圖片加載失敗
return;
}
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], (NSString *)kCGImageSourceShouldCache,
nil];
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (CFDictionaryRef)options);
if (imageProperties) {
NSNumber *width = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
NSNumber *height = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
// 打印圖片寬高
NSLog(@"Image dimensions: %@ x %@ px", width, height);
CFRelease(imageProperties);
}
CFRelease(imageSource);
// 獲取想要的元數(shù)據
// 返回的字典CGImageSourceCopyPropertiesAtIndex()包含的不僅僅是圖像尺寸哼丈。如果存在,它包括完整的EXIF和IPTC元數(shù)據以及TIFF凸椿,GIF削祈,JPEG,PNG和原始文件(以及其他)的各種文件格式特定信息。
// 舉一個例子髓抑,我們來看一下拍攝照片的日期咙崎,相機的型號名稱和存儲在元數(shù)據中的GPS坐標:
CFDictionaryRef exif = CFDictionaryGetValue(imageProperties, kCGImagePropertyExifDictionary);
if (exif) {
NSString *dateTakenString = (NSString *)CFDictionaryGetValue(exif, kCGImagePropertyExifDateTimeOriginal);
NSLog(@"Date Taken: %@", dateTakenString);
}
CFDictionaryRef tiff = CFDictionaryGetValue(imageProperties, kCGImagePropertyTIFFDictionary);
if (tiff) {
NSString *cameraModel = (NSString *)CFDictionaryGetValue(tiff, kCGImagePropertyTIFFModel);
NSLog(@"Camera Model: %@", cameraModel);
}
CFDictionaryRef gps = CFDictionaryGetValue(imageProperties, kCGImagePropertyGPSDictionary);
if (gps) {
NSString *latitudeString = (NSString *)CFDictionaryGetValue(gps, kCGImagePropertyGPSLatitude);
NSString *latitudeRef = (NSString *)CFDictionaryGetValue(gps, kCGImagePropertyGPSLatitudeRef);
NSString *longitudeString = (NSString *)CFDictionaryGetValue(gps, kCGImagePropertyGPSLongitude);
NSString *longitudeRef = (NSString *)CFDictionaryGetValue(gps, kCGImagePropertyGPSLongitudeRef);
NSLog(@"GPS Coordinates: %@ %@ / %@ %@", longitudeString, longitudeRef, latitudeString, latitudeRef);
}