当前位置: > > > Swift - 使用ALAssetsLibrary获取相簿里所有图片,视频(附样例)

Swift - 使用ALAssetsLibrary获取相簿里所有图片,视频(附样例)

1,ALAssetsLibrary介绍
(1)通过创建ALAssetsLibrary的实例可以访问系统Photos里的图片与视频。这里图片不仅包括相机拍摄的照片,还包括从iTunes导入的和从其他设备里面导入的图片。
(2)从ALAssetsLibrary实例中获取得到的对象的生命周期和ALAssetsLibrary这个实例的生命周期一致。
(3)通过enumerateGroupsWithTypes方法可以遍历所有的照片分组,再用分组的enumerateAssetsUsingBlock方法可以遍历该分组下所有的照片。
(4)通过valueForProperty获取到图片的信息,包括类型, Location , 时长,方向,日期,格式 , URL地址

2,下面做一个查看相册图片的APP
(1)程序启动后会加载相机胶卷里所有的照片,并以缩略图的形式展示出来
(2)点击缩略图,可以查看照片的原图以及图片的相关信息

3,效果图如下:
    

4,详细代码
--- 首页 ViewController.swift ---
import UIKit
import AssetsLibrary

class ViewController: UICollectionViewController {
    //资源库管理类
    var assetsLibrary =  ALAssetsLibrary()
    //保存照片集合
    var assets = [ALAsset]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        var countOne = 0
        //ALAssetsGroupSavedPhotos表示只读取相机胶卷(ALAssetsGroupAll则读取全部相簿)
        assetsLibrary.enumerateGroupsWithTypes(ALAssetsGroupSavedPhotos, usingBlock: {
            (group: ALAssetsGroup!, stop) in
            print("is goin")
            if group != nil
            {
                let assetBlock : ALAssetsGroupEnumerationResultsBlock = {
                    (result: ALAsset!, index: Int, stop) in
                    if result != nil
                    {
                        self.assets.append(result)
                        countOne++
                    }
                }
                group.enumerateAssetsUsingBlock(assetBlock)
                print("assets:\(countOne)")
                //collectionView网格重载数据
                self.collectionView?.reloadData()
            }
            }, failureBlock: { (fail) in
                print(fail)
        })
    }
    
    
    // CollectionView行数
    override func collectionView(collectionView: UICollectionView,
        numberOfItemsInSection section: Int) -> Int {
            return assets.count;
    }
    
    // 获取单元格
    override func collectionView(collectionView: UICollectionView,
        cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
            // storyboard里设计的单元格
            let identify:String = "DesignViewCell"
            // 获取设计的单元格,不需要再动态添加界面元素
            let cell = (self.collectionView?.dequeueReusableCellWithReuseIdentifier(
                identify, forIndexPath: indexPath))! as UICollectionViewCell
            
            //取缩略图
            let myAsset = assets[indexPath.item]
            let image = UIImage(CGImage:myAsset.thumbnail().takeUnretainedValue())
            // 从界面查找到控件元素并设置属性
            (cell.contentView.viewWithTag(1) as! UIImageView).image = image
            return cell
    }
    
    // 单元格点击响应
    override func collectionView(collectionView: UICollectionView,
        didSelectItemAtIndexPath indexPath: NSIndexPath) {
            var myAsset = assets[indexPath.item]
            
            //这里不使用segue跳转(建议用segue跳转)
            let detailViewController = UIStoryboard(name: "Main", bundle: nil)
                .instantiateViewControllerWithIdentifier("detail")
                as! ImageDetailViewController
            detailViewController.myAsset = self.assets[indexPath.row]
            
            // navigationController跳转到detailViewController
            self.navigationController!.pushViewController(detailViewController,
                animated:true)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

--- 详情页 ImageDetailViewController.swift ---
import UIKit
import AssetsLibrary

class ImageDetailViewController: UIViewController {
    //选中的图片资源
    var myAsset:ALAsset!
    //用于显示图片信息
    @IBOutlet weak var textView: UITextView!
    //用于显示原图
    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //获取文件名
        let representation =  myAsset.defaultRepresentation()
        self.title = representation.filename()
        
        //获取图片信息
        textView.text = "日期:\(myAsset.valueForProperty(ALAssetPropertyDate))\n"
            + "类型:\(myAsset.valueForProperty(ALAssetPropertyType))\n"
            + "位置:\(myAsset.valueForProperty(ALAssetPropertyLocation))\n"
            + "时长:\(myAsset.valueForProperty(ALAssetPropertyDuration))\n"
            + "方向:\(myAsset.valueForProperty(ALAssetPropertyOrientation))"
        
        //获取原图
        let imageBuffer = UnsafeMutablePointer<UInt8>.alloc(Int(representation.size()))
        let bufferSize = representation.getBytes(imageBuffer, fromOffset: Int64(0),
            length: Int(representation.size()), error: nil)
        let data =  NSData(bytesNoCopy:imageBuffer ,length:bufferSize, freeWhenDone:true)
        imageView.image = UIImage(data: data)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

5,源码下载:hangge_763.zip
评论2
  • 2楼
    2016-04-19 19:21
    hangge999

    hangge,有没有PhotosKit获取所有相册照片的例子啊。我不知道怎么用PhotoKit获取所有照片

    站长回复

    手头已经排了很多文章要写,这个要等下个月出了。

  • 1楼
    2015-11-21 19:01
    Noverre

    获取缩略图失败,无法显示。反而获取原图成功了~请问是什么原因?(菜鸟一枚……i)

    站长回复

    可能是Swift2的语法变化造成的,现已更新代码,你再试试看