[转]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

相关文章
相关标签/搜索