iOS把圖片緩存到本地的幾種方法(總結(jié))
把圖片緩存到本地,在很多場景都會用到,如果只是存儲文件信息,那建一個(gè)plist文件,或者數(shù)據(jù)庫就能很方便的解決問題,但是如果存儲圖片到沙盒就沒那么方便了。這里簡單介紹兩種保存圖片到沙盒的方法。
一、把圖片轉(zhuǎn)為base64的字符串存到數(shù)據(jù)庫中或者plist文件中,然后用到的時(shí)候再取出來
//獲取沙盒路徑, NSString *path_sandox = NSHomeDirectory(); //創(chuàng)建一個(gè)存儲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ù)的簡單方法: 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. 如果對圖片的清晰度要求不高,還可以通過設(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í)際使用場景,設(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í)候再利用存儲的字符串轉(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));
二、把圖片直接保存到沙盒中,然后再把路徑存儲起來,等到用圖片的時(shí)候先獲取圖片的路徑,再通過路徑拿到圖片
//拿到圖片 UIImage *image2 = [UIImage imageNamed:@"1.png"]; NSString *path_document = NSHomeDirectory(); //設(shè)置一個(gè)圖片的存儲路徑 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];
以上這篇iOS把圖片緩存到本地的幾種方法(總結(jié))就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
iOS實(shí)現(xiàn)漸變按鈕Gradient Button的方法示例
這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)漸變按鈕Gradient Button的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08iOS利用NSAttributedString實(shí)現(xiàn)圖文混排效果示例
iOS7以后,因?yàn)門extKit的強(qiáng)大,可以用NSAttributedString很方便的實(shí)現(xiàn)圖文混排(主要是利用了NSTextAttachment),所以下面這篇文章主要給大家介紹了關(guān)于iOS利用NSAttributedString實(shí)現(xiàn)圖文混排效果的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10iOS實(shí)現(xiàn)應(yīng)用內(nèi)切換本地化語言的方法實(shí)例
網(wǎng)絡(luò)上關(guān)于iOS國際化的文章很多,但基本上都是基于跟隨系統(tǒng)語言的國際化,而這篇文章主要給大家介紹了關(guān)于利用iOS實(shí)現(xiàn)應(yīng)用內(nèi)切換本地化語言的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考。2017-12-12