創建和使用 Image Source
Image Source
類抽象了數據訪問的任務,并且消除了你需要管理原始數據的需求。一個Image Source
對象可以包含一個以上圖片、縮略圖、每一個圖像的屬性和圖像的文件.當你使用圖片數據并且你的app運行在OS Xv10.4系統之后,Image Source
是一個很好地方法去把圖片的數據移動到你的應用中。你創建了一個CGImageSource
兌現之后,你可以獲取到圖像、縮略圖、書香屬性、圖像其他信息通過使用CGImageSource
中的方法。
從一個Image Source 中生成圖像
最常用的功能之一,你使用Image I/O Framework
從Image Source
中創建一個圖片,相似的代碼清單2-1這個例子展示了如何從根據一個路徑名來創建一個Image Source
并且提取圖片。當你創建成功了一個Image Source
對象,你可以知道圖片的格式。
當你要從一個Image Source
中生成一個圖片的時候。你必須制定一個下標而且你還可以提供一個屬相字典來制定這樣的事情例如是否創建縮略圖、是否允許緩存。你看查看 CGImageSouce Reference
和CGImageProperties Refrence
你必須需要制定一個下標,因為一個Image Source
中可以包含多種圖片。當Image Source file
中只包含一個圖片的時候,你可以傳一個 0
,你可以查找出來Image Source
中包含幾張圖片通過調用這個方法CGImageSourceGetCount
清單2-1
- (void)viewDidLoad {
[super viewDidLoad];
NSString *path = [[NSBundle mainBundle] pathForResource:@"huoche" ofType:@"png"];
UIImage *image = [self getImageWithPath:path];
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
imageView.frame = CGRectMake(20, 20, 50, 50);
[self.view addSubview:imageView];
}
- (UIImage *)getImageWithPath:(NSString *)imagePath {
// 生成url根據傳過來的圖片路徑
NSURL *fileURL = [NSURL fileURLWithPath:imagePath];
// 因為ImageIO框架是一個C語言框架所以我們應該使用Core Foundation,對NSURL進行轉化
CFURLRef fileCFURL = (__bridge CFURLRef)fileURL;
NSDictionary *dic = @{(__bridge_transfer NSString *)kCGImageSourceShouldAllowFloat: @YES,
(__bridge_transfer NSString *)kCGImageSourceShouldCache: @YES};
CFDictionaryRef options =(__bridge_retained CFDictionaryRef)dic;
//CFURLRef url,這是圖片的資源標識
//CFDictionaryRef options。這個參數表示對source的設置。像我們在上文提到過的時候創建縮略圖、是否緩存。
// 查看 CGImageProperties Reference
CGImageSourceRef source = CGImageSourceCreateWithURL(fileCFURL, options);
CFRelease(options);
CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, 0, nil);
CFRelease(source);
if (!imageRef) {
NSLog(@"Error");
return nil;
}
UIImage *image = [UIImage imageWithCGImage:imageRef];
return image;
}
創建縮略圖從Image Source
許多Image Source file
包含了你可以索引到的縮略圖。如果縮略圖沒有存在,你可以在創建Image Source
的時候指定選項進行生成縮略圖操作。你還可以指定生成縮略圖的最大size而且還是至一定縮略圖是否翻轉。
清單2-2展示了如何從一個data
中創建一個Image Source
,并且設置關于縮略圖的約束選項。之后創建一個縮略圖。你可以使用這個關鍵字kCGImageSourceCreateThumbnailWithTransform
去指定縮略圖應該旋轉或者縮小來時適應圖像
清單2-2
-(UIImage *)getThumbnailImageWithData:(NSData *)imageData {
NSDictionary *dic = @{(__bridge_transfer NSString *)kCGImageSourceShouldAllowFloat: @YES,
(__bridge_transfer NSString *)kCGImageSourceShouldCache: @YES,
(__bridge_transfer NSString *)kCGImageSourceCreateThumbnailFromImageIfAbsent: @YES,
(__bridge_transfer NSString *)kCGImageSourceThumbnailMaxPixelSize: [NSNumber numberWithInteger:20]};
CFDictionaryRef options =(__bridge_retained CFDictionaryRef)dic;
//CFURLRef url,這是圖片的資源標識
//CFDictionaryRef options。這個參數表示對source的設置。像我們在上文提到過的時候創建縮略圖、是否緩存。
// 查看 CGImageProperties Reference
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
CFRelease(options);
CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(source, 0, options);
CFRelease(source);
if (!imageRef) {
NSLog(@"Error");
return nil;
}
UIImage *image = [UIImage imageWithCGImage:imageRef];
return image;
}
縮略圖只能制定的size都是寬=高
逐步加載圖片
如果你有非常大的圖片,或者你要在網上來加載你的圖片。你可以創建一個累計數據的Image Source
類,這樣你就可以根據的你的計算來顯示圖片。你需要執行下面的任務來逐步的加載一個圖片數據從一個CFData
中:
- 創建一個
CFData
來累計圖片數據 - 創建一個逐步的
Image Source
,通過調用方法CGImageSourceCreateIncremental
- 增加圖片數據到
CFData
- 調用方法
CGImageSourceUpdateData
,傳送CFData
對象和一個布爾值,這個布爾值用來指定CFData
參數是否包含整個圖片或者部分圖片。在任何情況下數據參數必須包含所有的目前已經累計到到圖片數據 - 如果你已經累積到了足夠的數據,你可以創建一個
image
通過這個方法CGImageSourceCreateImageAtIndex
,渲染部分圖片。之后再釋放他 - 通過調用
CGImageSourceGetStatusAtIndex
方法可以檢查你時候接受完全部的數據。如果方法返回KCGImageSourceComplete
那么說明數據已經全部加載完成。如果沒有重復執行3和4 - 釋放
Image Source
對象
- (UIImage *)getIncrementalImageWithData:(NSData *)imageData finish:(NSNumber*)isFinish {
CFDataRef dataRef = (__bridge CFDataRef)imageData;
CGImageSourceUpdateData(self.mySource, dataRef, (__bridge CFBooleanRef)isFinish);
CGImageRef imageRef = CGImageSourceCreateImageAtIndex(self.mySource, 0, NULL);
UIImage *image = [UIImage imageWithCGImage:imageRef];
return image;
}
展示圖片的屬性
數字圖片含有豐富的信息包括圖片尺寸、圖片分辨率、圖片方向、圖片顏色輪廓、光圈、計算模式、焦距、創建時間,關鍵字、標題和更多信息。這些信息是非常有用的對于圖片的處理和編輯,只有當這些數據是暴露哎用戶的界面。雖然方法CGImageSourceCopyPropertiesAtIndex
可以查找到在ImageSource
中一個圖片的屬性信息,以字典的方式返回出來。但是你必須編寫一些代碼來遍歷這個字典,查到到圖片屬性的信息,并且把它們展示出來。