[轉]iOS:批量導入圖片和視頻到模擬器的相冊

   IOS開發中咱們常常會用到模擬器調試,模擬器有個主要的好處就是程序啓動塊,最重要的是若是沒有證書的話,咱們就只能在模擬器上調試了。使用模擬器調試時咱們可能碰到須要從系統相冊選擇圖片的狀況,特別是作圖片處理類相關的程序時,更是常常用到。html

  初始化狀況下模擬器中的相冊中是空的,因此要想選擇,咱們就得先導入一些圖片。一般的作法是將圖片直接拖拽到模擬器上,而後模擬器就會用safari打開,這個時候咱們再長按圖片就會彈出保存到系統相冊的菜單了,這樣一個完整的圖片保存流程就完成了。可是這中方法有一個明顯的缺點就是效率過低,試想你要作圖片處理的話確定得測試各類尺寸,各類比例的圖片,這樣一個個導入無疑是對程序員的一種摧殘。git

  那麼如何才能批量的導入圖片呢?程序員

  我最開始的時候的想法是找到模擬器存放的目錄,而後定位到照片文件夾下面,直接把圖片拷貝進去不就搞定了。因而打開finder尋找到了模擬器的安裝路徑,好比6.1的模擬器的路徑就是: /Users/maple/Library/Application Support/iPhone Simulator/6.1/github

  咱們使用命令行進入這個目錄,並找到照片文件夾的路徑: /Users/maple/Library/Application Support/iPhone Simulator/6.1/Media/DCIM,而後將照片拷貝進去。本覺得大功告成,結果重啓了模擬器之後發現系統相冊較以前毫無變化,想想應該只由於咱們只把圖片拷貝進去了,卻沒有更新系統相冊對應的數據庫。若是能在拷貝圖片的同時,更新系統相冊對應的數據庫,我猜應該就能搞定了,只是代價比較大,因此只好放棄。數據庫

  只好換別的方法了,記得之前作上一個項目的時候好像有一個API是能夠保存圖片到系統相冊的,因而找到這個API: UIImageWriteToSavedPhotosAlbum。想着若是我建一個工程,把要加的圖片加到工程裏面,而後在程序中經過遍歷這些圖片,一次調用UIImageWriteToSavedPhotosAlbum這個方法,因此的圖片不就所有導入到系統相冊了嗎?async

  說作就作,先寫了一個簡單的函數試了一下,的確能夠達到目的,而後繼續完善思路,添加了監測拷貝進度的功能,作了一個簡單的進度界面。ide

  關鍵的保存圖片的函數片斷以下:函數

複製代碼
- (void)saveMediaToCameraRoll
{
    // // traverse the main bundle to find out all image files
    NSMutableArray *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 project
    NSMutableArray *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 files
    NSMutableArray *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 roll
    for (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 roll
    for (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]];
        }
    }
}
複製代碼

  忽略界面更新回調相關的邏輯,程序的主要流程以下:測試

  1)找到當前程序包中全部的圖片文件,注意這塊兒要排除掉工程自帶的圖片如Default.png等;this

  2)對找到的全部圖片文件調用保存到系統相冊的函數。

  通過測試本程序能夠實現批量導入圖片到系統相冊的功能,因而想着更進一步視頻是否也能夠批量導入呢?通過查找發現也有一個API:  UISaveVideoAtPathToSavedPhotosAlbum,而後順便添加了批量導入視頻的功能,通過測試能夠正常導入。

  整個工程的代碼在github上,地址: https://github.com/smileEvday/SvSaveToCameraRoll

 

(來自:http://www.cnblogs.com/smileEvday/archive/2013/04/16/SaveToCameraRoll.html

相關文章
相關標籤/搜索