IOS:批量导入图片和视频到模拟器的相册
批量導(dǎo)入圖片和視頻到模擬器的相冊(cè)
?
IOS開發(fā)中我們經(jīng)常會(huì)用到模擬器調(diào)試,模擬器有個(gè)主要的好處就是程序啟動(dòng)塊,最重要的是如果沒有證書的話,我們就只能在模擬器上調(diào)試了。使用模擬器調(diào)試時(shí)我們可能碰到需要從系統(tǒng)相冊(cè)選擇圖片的情況,特別是做圖片處理類相關(guān)的程序時(shí),更是經(jīng)常用到。
初始化情況下模擬器中的相冊(cè)中是空的,所以要想選擇,我們就得先導(dǎo)入一些圖片。通常的做法是將圖片直接拖拽到模擬器上,然后模擬器就會(huì)用safari打開,這個(gè)時(shí)候我們?cè)匍L(zhǎng)按圖片就會(huì)彈出保存到系統(tǒng)相冊(cè)的菜單了,這樣一個(gè)完整的圖片保存流程就完成了。但是這中方法有一個(gè)明顯的缺點(diǎn)就是效率太低,試想你要做圖片處理的話肯定得測(cè)試各種尺寸,各種比例的圖片,這樣一個(gè)個(gè)導(dǎo)入無(wú)疑是對(duì)程序員的一種摧殘。
那么如何才能批量的導(dǎo)入圖片呢?
我最開始的時(shí)候的想法是找到模擬器存放的目錄,然后定位到照片文件夾下面,直接把圖片拷貝進(jìn)去不就搞定了。于是打開finder尋找到了模擬器的安裝路徑,比如6.1的模擬器的路徑就是:?/Users/maple/Library/Application Support/iPhone Simulator/6.1/
我們使用命令行進(jìn)入這個(gè)目錄,并找到照片文件夾的路徑:?/Users/maple/Library/Application Support/iPhone Simulator/6.1/Media/DCIM,然后將照片拷貝進(jìn)去。本以為大功告成,結(jié)果重啟了模擬器以后發(fā)現(xiàn)系統(tǒng)相冊(cè)較之前毫無(wú)變化,想一想應(yīng)該只因?yàn)槲覀冎话褕D片拷貝進(jìn)去了,卻沒有更新系統(tǒng)相冊(cè)對(duì)應(yīng)的數(shù)據(jù)庫(kù)。如果能在拷貝圖片的同時(shí),更新系統(tǒng)相冊(cè)對(duì)應(yīng)的數(shù)據(jù)庫(kù),我猜應(yīng)該就能搞定了,只是代價(jià)比較大,所以只好放棄。
只好換別的方法了,記得以前做上一個(gè)項(xiàng)目的時(shí)候好像有一個(gè)API是可以保存圖片到系統(tǒng)相冊(cè)的,于是找到這個(gè)API:?UIImageWriteToSavedPhotosAlbum。想著如果我建一個(gè)工程,把要加的圖片加到工程里面,然后在程序中通過(guò)遍歷這些圖片,一次調(diào)用UIImageWriteToSavedPhotosAlbum這個(gè)方法,所以的圖片不就全部導(dǎo)入到系統(tǒng)相冊(cè)了嗎?
說(shuō)做就做,先寫了一個(gè)簡(jiǎn)單的函數(shù)試了一下,的確可以達(dá)到目的,然后繼續(xù)完善思路,添加了監(jiān)測(cè)拷貝進(jìn)度的功能,做了一個(gè)簡(jiǎn)單的進(jìn)度界面。
關(guān)鍵的保存圖片的函數(shù)片段如下:
- (void)saveMediaToCameraRoll {// // traverse the main bundle to find out all image filesNSMutableArray *picArray = [NSMutableArray arrayWithCapacity:3];NSArray *jpgFiles = [[NSBundle mainBundle] pathsForResourcesOfType:@"jpg" inDirectory:nil];[picArray addObjectsFromArray:jpgFiles];NSArray *pngArray = [[NSBundle mainBundle] pathsForResourcesOfType:@"png" inDirectory:nil];// exclude launch image of this projectNSMutableArray *picExcludeDefault = [NSMutableArray arrayWithArray:pngArray];for (NSString *path in pngArray) {NSArray *pathCom = [path pathComponents];if ([pathCom containsObject:@"Default-568h@2x.png"]|| [pathCom containsObject:@"Default.png"]|| [pathCom containsObject:@"Default@2x.png"]) {[picExcludeDefault removeObject:path];}}pngArray = picExcludeDefault;[picArray addObjectsFromArray:pngArray];// traverse the main bundle to find out all mov filesNSMutableArray *videoArray = [NSMutableArray arrayWithCapacity:3];NSArray *movs = [[NSBundle mainBundle] pathsForResourcesOfType:@"mov" inDirectory:nil];[videoArray addObjectsFromArray:movs];_mediaItemCount = picArray.count + videoArray.count;if (delegate && [delegate respondsToSelector:@selector(saveToUtilStartCopy:)]) {[delegate saveToUtilStartCopy:_mediaItemCount];}// save pic to camera rollfor (id item in picArray) {UIImage *img = [[UIImage alloc] initWithContentsOfFile:item];// Note:save to camera roll is async, so the later item may copy complete than previous item UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);[img release];}// save video to camera rollfor (id item in videoArray) {if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(item)) {// Note:save to camera roll is async, so the later item may copy complete than previous item UISaveVideoAtPathToSavedPhotosAlbum(item, self, @selector(video:didFinishSavingWithError:contextInfo:), NULL);}else {[self updateProcessWithError:[NSError errorWithDomain:@"copy video error" code:-1 userInfo:nil]];}} }忽略界面更新回調(diào)相關(guān)的邏輯,程序的主要流程如下:
1)找到當(dāng)前程序包中所有的圖片文件,注意這塊兒要排除掉工程自帶的圖片如Default.png等;
2)對(duì)找到的所有圖片文件調(diào)用保存到系統(tǒng)相冊(cè)的函數(shù)。
經(jīng)過(guò)測(cè)試本程序可以實(shí)現(xiàn)批量導(dǎo)入圖片到系統(tǒng)相冊(cè)的功能,于是想著更進(jìn)一步視頻是否也可以批量導(dǎo)入呢?經(jīng)過(guò)查找發(fā)現(xiàn)也有一個(gè)API: ?UISaveVideoAtPathToSavedPhotosAlbum,然后順便添加了批量導(dǎo)入視頻的功能,經(jīng)過(guò)測(cè)試可以正常導(dǎo)入。
整個(gè)工程的代碼在github上,地址:?https://github.com/smileEvday/SvSaveToCameraRoll
注:轉(zhuǎn)載請(qǐng)注明出處!歡迎大家加我QQ 1592232964,一起討論共同進(jìn)步。
?
總結(jié)
以上是生活随笔為你收集整理的IOS:批量导入图片和视频到模拟器的相册的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【java】System.getProp
- 下一篇: 模板技巧之:费用科目条件过滤