让我在公司搞了整整五天的问题啊!!!!
我知道的apple提供的操作相册总共有两种方式:UIImagePickerController和ALAssetsLibrary(有第三种方式欢迎第一时间告诉我啊!!!)。
UIImagePickerController就是调用系统提供的相册,好在方便直接几个代理就搞定,想要的信息也能获取到,不过就是界面丑了点,因为是系统提供的相册没办法改UI,都是封装好的,不过好在方便。
ALAssetsLibrary我感觉就很反人类了,它只是提供了相册、图片的信息,可以取出图片缩略图、全屏图和原图之类的,想要获取大小写文件等等都是能够完成,好处就是界面随你编,UI不会搞死你。不过很反人类的是截取出来的url很蛋疼,只能用ALAssetsLibrary根据url取图片,想用imagewithurl之类的方法取图片操作 啥的做不到,(因为不是真实地址啊)。而且是block块编程,我很不熟练,要注意的是相册操作完之后就会自动关闭了,就是程序块执行完你再根据url啥都拿不到。
再谈谈ios里面图片的操作,首先说一下一张图片一次放到内存里有多大空间
长 * 宽 * 字节数 / (1024 * 1024) = 所占内存
长宽的单位是像素,一般jpg格式的图片一个像素占3-4个字节,png是4个字节,一个6M的图片,大概是14000*8000个像素,内存就是占了约400M哦!! 瞬间内存大的惊人。(友情提示下,如果你把png的文件扩展名改为jpg其实文件还是png格式 只是给你显示是jpg而已,用二进制打开就可以看的很清楚)。
然后看看我知道的几种图片操作方式:UIImage、UIImageCreateRef(好像是,mac没在手里大家自己查),再就是ImageMagick(很老的一个库)。
用UIimage是将图片一次全部拿到内存里,根据刚才的算法,一张图很容易造成真机假重启,比如touch和4,4s也没好多少。不过UIimage给的接口很多,操作真是很方便,就算是用后两种方法说不定也要最后转换成UIimage。
UIImageCreateRef虽然用的不多,但是也算是比较方便的一种,在生成时option选项可以选择几个参数,利用imagesourceref(大概是这个)可以指定文件源,datasource和imagesource都行。根据这个方法可以直接生成缩略图,6M多的图片指定变长1000多就会很小(我用的时候指定边长参数失效直接取原图,不知道为啥)。不过说明文档不太容易读,挺恶心的。注意的是ref结尾的变量用完之后要手动release,即使你程序使用了arc。
最后就是imagemagick了。这是一个很神奇的库,乱七八糟什么平台都有。是一个纯C的库,我用的那个头文件里面300多行,全是函数,一个注释没有一个参数说明没有。好像就是为了解决3gs内存太小的问题,可以对图片进行乱七八糟各种神奇的操作。可以指定资源限制,比如内存限制,超过你限制的内存就直接全部文件放到缓存里,结果就是即使那张6M的图也可以读出来,不过凡事是有代价的,他的代价就是时间。读取文件+resize的时间难以忍受。可以看到源码,但是一个注释说明文档文字都看不到。而且由于是纯C库,而且头文件命名都是短文件名使得引入到你的工程里非常麻烦。不过方法非常多,要是能研究明白使用方法都非常牛逼!!!!
再提一下就是处理相机图片的时候要注意坐标系,相机的图片和手机的坐标系不一样,容易发生图片倾斜之类的问题。