1. 程式人生 > >iOS把圖片快取到本地的幾種方法

iOS把圖片快取到本地的幾種方法

概述

把圖片快取到本地,在很多場景都會用到,如果只是儲存檔案資訊,那建一個plist檔案,或者資料庫就能很方便的解決問題,但是如果儲存圖片到沙盒就沒那麼方便了。這裡簡單介紹兩種儲存圖片到沙盒的方法。

一.把圖片轉為base64的字串存到資料庫中或者plist檔案中,然後用到的時候再取出來

 //獲取沙盒路徑,  
 NSString *path_sandox = NSHomeDirectory();  
 //建立一個儲存plist檔案的路徑  
 NSString *newPath = [path_sandox stringByAppendingPathComponent:@/Documents/pic.plist
]; NSMutableArray *arr = [[NSMutableArray alloc] init]; UIImage *image = [UIImage imageNamed:@"1.png"]; /* 把圖片轉換為Base64的字串 在iphone上有兩種讀取圖片資料的簡單方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函式需要兩個引數:圖片的引用和壓縮係數.而UIImagePNGRepresentation只需要圖片引用作為引數.通過在實際使用過程中, 比較發現: UIImagePNGRepresentation(UIImage* image) 要比UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的圖片資料量大很多. 譬如,同樣是讀取攝像頭拍攝的同樣景色的照片, UIImagePNGRepresentation()返回的資料量大小為199K , 而 UIImageJPEGRepresentation(UIImage* image, 1.0)返回的資料量大小隻為140KB,比前者少了50多KB. 如果對圖片的清晰度要求不高,還可以通過設定 UIImageJPEGRepresentation函式的第二個引數,大幅度降低圖片資料量.譬如,剛才拍攝的圖片, 通過呼叫UIImageJPEGRepresentation(UIImage* image, 1.0)讀取資料時,返回的資料大小為140KB,但更改壓縮係數後, 通過呼叫UIImageJPEGRepresentation(UIImage* image, 0.5)讀取資料時,返回的資料大小隻有11KB多,大大壓縮了圖片的資料量 , 而且從視角角度看,圖片的質量並沒有明顯的降低.因此,在讀取圖片資料內容時,建議優先使用UIImageJPEGRepresentation, 並可根據自己的實際使用場景,設定壓縮係數,進一步降低圖片資料量大小. */
NSData *_data = UIImageJPEGRepresentation(image, 1.0f); //將圖片的data轉化為字串 NSString *strimage64 = [_data base64EncodedString]; [arr addObject:image64]; //寫入plist檔案 if ([arr writeToFile:newPath atomically:YES]) { NSLog(@"寫入成功"); }; //可以到沙河路徑下檢視plist檔案中的圖片資料 //這樣就存起來的,然後用到的時候再利用儲存的字串轉化為圖片
//NSData *_decodedImageData = [[NSData alloc] initWithBase64Encoding:image64]; 這是iOS7之前的一個方法 NSData *_decodedImageData = [[NSData alloc]initWithBase64EncodedString:strimage64 options:NSDataBase64DecodingIgnoreUnknownCharacters]; UIImage *_decodedImage = [UIImage imageWithData:_decodedImageData]; //可以列印下圖片是否存在 NSLog(@"===Decoded image size: %@", NSStringFromCGSize(_decodedImage.size));

二.把圖片直接儲存到沙盒中,然後再把路徑儲存起來,等到用圖片的時候先獲取圖片的路徑,再通過路徑拿到圖片

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

同時附上獲取沙盒目錄的程式碼

//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];