iOS把圖片緩存到本地的兩種方法

概述

  • 把圖片緩存到本地,在很多場(chǎng)景都會(huì)用到,如果只是存儲(chǔ)文件信息,那建一個(gè)plist文件,或者數(shù)據(jù)庫(kù)就能很方便的解決問題,但是如果存儲(chǔ)圖片到沙盒就沒那么方便了。這里簡(jiǎn)單介紹兩種保存圖片到沙盒的方法。

一.把圖片轉(zhuǎn)為base64的字符串存到數(shù)據(jù)庫(kù)中或者plist文件中,然后用到的時(shí)候再取出來

 //獲取沙盒路徑,  
 NSString *path_sandox = NSHomeDirectory();  
 //創(chuàng)建一個(gè)存儲(chǔ)plist文件的路徑  
 NSString *newPath = [path_sandox stringByAppendingPathComponent:@/Documents/pic.plist];  
 NSMutableArray *arr = [[NSMutableArray alloc] init];  
 UIImage *image = [UIImage imageNamed:@"1.png"];  
       
 /* 
 
  把圖片轉(zhuǎn)換為Base64的字符串   
 
 
  在iphone上有兩種讀取圖片數(shù)據(jù)的簡(jiǎn)單方法: UIImageJPEGRepresentation和UIImagePNGRepresentation.  
   
  UIImageJPEGRepresentation函數(shù)需要兩個(gè)參數(shù):圖片的引用和壓縮系數(shù).而UIImagePNGRepresentation只需要圖片引用作為參數(shù).通過在實(shí)際使用過程中, 
  比較發(fā)現(xiàn): UIImagePNGRepresentation(UIImage* image) 要比UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的圖片數(shù)據(jù)量大很多. 
  譬如,同樣是讀取攝像頭拍攝的同樣景色的照片, UIImagePNGRepresentation()返回的數(shù)據(jù)量大小為199K , 
  而 UIImageJPEGRepresentation(UIImage* image, 1.0)返回的數(shù)據(jù)量大小只為140KB,比前者少了50多KB. 
  如果對(duì)圖片的清晰度要求不高,還可以通過設(shè)置 UIImageJPEGRepresentation函數(shù)的第二個(gè)參數(shù),大幅度降低圖片數(shù)據(jù)量.譬如,剛才拍攝的圖片,  
  通過調(diào)用UIImageJPEGRepresentation(UIImage* image, 1.0)讀取數(shù)據(jù)時(shí),返回的數(shù)據(jù)大小為140KB,但更改壓縮系數(shù)后, 
  通過調(diào)用UIImageJPEGRepresentation(UIImage* image, 0.5)讀取數(shù)據(jù)時(shí),返回的數(shù)據(jù)大小只有11KB多,大大壓縮了圖片的數(shù)據(jù)量 , 
  而且從視角角度看,圖片的質(zhì)量并沒有明顯的降低.因此,在讀取圖片數(shù)據(jù)內(nèi)容時(shí),建議優(yōu)先使用UIImageJPEGRepresentation, 
  并可根據(jù)自己的實(shí)際使用場(chǎng)景,設(shè)置壓縮系數(shù),進(jìn)一步降低圖片數(shù)據(jù)量大小. 
  */  
  
 NSData *_data = UIImageJPEGRepresentation(image, 1.0f);  
 //將圖片的data轉(zhuǎn)化為字符串  
 NSString *strimage64 = [_data base64EncodedString];  
  
 [arr addObject:image64];      
  //寫入plist文件      
 if ([arr writeToFile:newPath atomically:YES]) {         
 NSLog(@"寫入成功");      
};  
 //可以到沙河路徑下查看plist文件中的圖片數(shù)據(jù)   
  
 //這樣就存起來的,然后用到的時(shí)候再利用存儲(chǔ)的字符串轉(zhuǎn)化為圖片  
  
 //NSData *_decodedImageData = [[NSData alloc] initWithBase64Encoding:image64];  這是iOS7之前的一個(gè)方法   
   
 NSData *_decodedImageData = [[NSData alloc]initWithBase64EncodedString:strimage64 options:NSDataBase64DecodingIgnoreUnknownCharacters];  
 UIImage *_decodedImage = [UIImage imageWithData:_decodedImageData];  
   
 //可以打印下圖片是否存在  
 NSLog(@"===Decoded image size: %@", NSStringFromCGSize(_decodedImage.size)); 

二.把圖片直接保存到沙盒中,然后再把路徑存儲(chǔ)起來,等到用圖片的時(shí)候先獲取圖片的路徑,再通過路徑拿到圖片

//拿到圖片  
UIImage *image2 = [UIImage imageNamed:@"1.png"];   
NSString *path_document = NSHomeDirectory();  
//設(shè)置一個(gè)圖片的存儲(chǔ)路徑  
NSString *imagePath = [path_document stringByAppendingString:@"/Documents/pic.png"];  
//把圖片直接保存到指定的路徑(同時(shí)應(yīng)該把圖片的路徑imagePath存起來,下次就可以直接用來取)  
[UIImagePNGRepresentation(image2) writeToFile:imagePath atomically:YES];  
  • 下次利用圖片的地址直接來拿圖片
UIImage *getimage2 = [UIImage imageWithContentsOfFile:imagePath];  
NSLog(@"image2 is size %@",NSStringFromCGSize(getimage2.size));

同時(shí)附上獲取沙盒目錄的代碼

//Home目錄

沙盒文件目錄獲取代碼:

NSString *homeDirectory = NSHomeDirectory(); 

//Document目錄

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    
NSString *path = [paths objectAtIndex:0];  

//Cache目錄

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);    
NSString *path = [paths objectAtIndex:0];  

//Libaray目錄

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);   
NSString *path = [paths objectAtIndex:0];  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 把圖片緩存到本地,在很多場(chǎng)景都會(huì)用到,如果只是存儲(chǔ)文件信息,那建一個(gè)plist文件,或者數(shù)據(jù)庫(kù)就能很方便的解決問題...
    饅頭壓扁就是餅閱讀 6,413評(píng)論 1 1
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,624評(píng)論 30 472
  • 沙盒 Plist Preference偏好設(shè)置 NSKeyedArchiver歸檔 / NSKeyedUnarch...
    追風(fēng)者366閱讀 3,604評(píng)論 0 6
  • 沙盒中的目錄 AppName.app 內(nèi)容:此目錄包含了應(yīng)用程序及其所有資源文件。 讀寫操作:不能寫入該目錄,可以...
    devRen閱讀 15,620評(píng)論 0 8
  • 據(jù)說Ukulele是一百多年前來自葡萄牙的專業(yè)手工藝人和樂器制作家?guī)У较耐牡?,?dāng)?shù)厝梭@異于這種琴音色之優(yōu)美以及演...
    seg閱讀 192評(píng)論 0 0

友情鏈接更多精彩內(nèi)容