• IOS:批量导入图片和视频到模拟器的相册 一片


    批量导入图片和视频到模拟器的相册

     

      IOS开发中我们经常会用到模拟器调试,模拟器有个主要的好处就是程序启动块,最重要的是如果没有证书的话,我们就只能在模拟器上调试了。使用模拟器调试时我们可能碰到需要从系统相册选择图片的情况,特别是做图片处理类相关的程序时,更是经常用到。

      初始化情况下模拟器中的相册中是空的,所以要想选择,我们就得先导入一些图片。通常的做法是将图片直接拖拽到模拟器上,然后模拟器就会用safari打开,这个时候我们再长按图片就会弹出保存到系统相册的菜单了,这样一个完整的图片保存流程就完成了。但是这中方法有一个明显的缺点就是效率太低,试想你要做图片处理的话肯定得测试各种尺寸,各种比例的图片,这样一个个导入无疑是对程序员的一种摧残。

      那么如何才能批量的导入图片呢?

      我最开始的时候的想法是找到模拟器存放的目录,然后定位到照片文件夹下面,直接把图片拷贝进去不就搞定了。于是打开finder寻找到了模拟器的安装路径,比如6.1的模拟器的路径就是: /Users/maple/Library/Application Support/iPhone Simulator/6.1/

      我们使用命令行进入这个目录,并找到照片文件夹的路径: /Users/maple/Library/Application Support/iPhone Simulator/6.1/Media/DCIM,然后将照片拷贝进去。本以为大功告成,结果重启了模拟器以后发现系统相册较之前毫无变化,想一想应该只因为我们只把图片拷贝进去了,却没有更新系统相册对应的数据库。如果能在拷贝图片的同时,更新系统相册对应的数据库,我猜应该就能搞定了,只是代价比较大,所以只好放弃。

      只好换别的方法了,记得以前做上一个项目的时候好像有一个API是可以保存图片到系统相册的,于是找到这个API: UIImageWriteToSavedPhotosAlbum。想着如果我建一个工程,把要加的图片加到工程里面,然后在程序中通过遍历这些图片,一次调用UIImageWriteToSavedPhotosAlbum这个方法,所以的图片不就全部导入到系统相册了吗?

      说做就做,先写了一个简单的函数试了一下,的确可以达到目的,然后继续完善思路,添加了监测拷贝进度的功能,做了一个简单的进度界面。

      关键的保存图片的函数片段如下:

    - (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等;

      2)对找到的所有图片文件调用保存到系统相册的函数。

      经过测试本程序可以实现批量导入图片到系统相册的功能,于是想着更进一步视频是否也可以批量导入呢?经过查找发现也有一个API:  UISaveVideoAtPathToSavedPhotosAlbum,然后顺便添加了批量导入视频的功能,经过测试可以正常导入。

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

      

    注:转载请注明出处!欢迎大家加我QQ 1592232964,一起讨论共同进步。

  • 相关阅读:
    Windows 10 Universal App 开发记录
    Windows Phone 8.1 开发会用到的方法
    Android Activity设置全屏
    Android视频录制命令screenrecord
    Android ScrollView中嵌套ListView只显示一行的解决办法
    Android 4.4.4: java.lang.SecurityException: Package com.android.settings does not belong to 1001
    自定义Android spinner样式并添加监听事件
    GSON快速实现内部类
    android的Banner轮播图框架
    Okhttp与Okhttputils的用法及区别
  • 原文地址:https://www.cnblogs.com/smileEvday/p/SaveToCameraRoll.html
Copyright © 2020-2023  润新知