photos框架的使用

Swift4.0--Photos框架的使用附从相簿中获取图片 首先发布Demo链接 Photos从相簿中获取图片效果展示 (一) Photos简介 在iOS 8之前,开发者只能用 AssetsLibrary 框架访问的用户的照片库。几年以来,相机应用和照片应用发生了显著的变化,增加了许多新特性,包括按时刻来组织照片的方式。但与此同时,AssetsLibrary 框架却没有跟上步伐。 随着 iOS 8 的到来,苹果给我们提供了一个现代化的框架 阅读详情

参考资料


代码相关


使用
1> 导入框架头:#import <Photos/Photos.h>
2> 获取所有胶卷名字
#pragma mark 获取所有的胶卷的名字
+ (NSMutableArray *)getAlbumObjects;

#pragma mark 获取胶卷的名字相关数据
+ (NSMutableArray *)getAlbumObjects {

    NSMutableArray *array = [NSMutableArray array];

    // 获得相机胶卷
    PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject;
    [array addObject:cameraRoll];

    // 获得所有的自定义相簿
    PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

    for (PHAssetCollection *assetCollection in assetCollections) {

        PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];

        if (assets.count) { // 如果相册里有图片,则添加到数组中
            [array addObject:assetCollection];
        }
    }

    return array;

}
3> 根据胶卷名字,获取所有的相册的封面图
#pragma mark 获取封面图片方法
+ (void)getCoverImageWith:(PHAssetCollection *)assetCollection withBlcok:(void(^)(UIImage *image))image;

#pragma mark 获取封面图片方法
+ (void)getCoverImageWith:(PHAssetCollection *)assetCollection withBlcok:(void(^)(UIImage *image))image {
    PHFetchResult *assetResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
    [[PHImageManager defaultManager] requestImageForAsset:assetResult.firstObject targetSize:CGSizeZero contentMode:PHImageContentModeDefault options:[PHImageRequestOptions new] resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        image(result);
    }];

}
4> 获取每个相册的相片数量,用于显示在相册列表
#pragma mark 获取指定胶卷儿的照片的数量
+ (NSUInteger)getAlbumCountWith:(PHAssetCollection *)assetCollection;

#pragma mark 获取某胶卷儿的照片数量
+ (NSUInteger)getAlbumCountWith:(PHAssetCollection *)assetCollection {
    // 获得某个相簿中的所有PHAsset对象
    PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
    return assets.count;
}
5> 获取单个相册的所有的缩略图,一次获取pageNumber张,并且可以通过页面滚动动态加载,这样的话就可以解决一次加载成百上千张造成的整个页面的卡顿甚至直接崩溃的问题
#pragma mark 滚动代理相关
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    /**
     基本逻辑:
     如果上一阶段的pageNumber中的图片添加完毕,每一组图片的高度大约为3000,
     数值方向的偏移量大于3000,并且不是最后一张,就加载下一组的图片,大约一组
     图片用零点几秒时间,无影响
     */

    if (scrollView == self.collectionView) {

        if (self.isAddPage && self.collectionView.contentOffset.y > self.currentPage*3000-700 && self.currentPage < self.totalPage ) {

            self.isAddPage = NO;

            // 获取单个相册中的200张图片
            [AlbumTool getAlbumThumbnailWithAssetCollection:[self.albumsArray objectAtIndex:self.albumIndex] withPage:self.currentPage+1 andComplete:^(NSMutableArray *modelArray, NSInteger totalPhotos, NSInteger totalPage, NSInteger currentPage) {

                [self.albumModelArray addObjectsFromArray:modelArray];
                self.currentPage = currentPage; // 指定当前页数
                self.totalPage = totalPage; // 获取相册所有页数
                self.isAddPage = YES; // 如果有了返回数据,则可以进行添加了

                // 新添加一步,对两个数据源进行比较,用于初始化显示
                [self compareTwoModelArray]; // 可以一次匹配100张,这个也许可以
            }];
        }
    }
}

#pragma mark 比较两个数组中元素
- (void)compareTwoModelArray {

    /**
     匹配规则:
     新添加判断,一次只匹配比较pageNumber张
     */

    NSLog(@"self.modelAdditionArray.count; ==== %lu",(unsigned long)self.modelAdditionArray.count);

    NSInteger compareNumber = 0;

    if (self.currentPage*PageNumber + PageNumber < self.albumModelArray.count) {
        compareNumber = self.currentPage*PageNumber + PageNumber;
    } else {
        compareNumber = self.albumModelArray.count;
    }

    for (CertificateCellModel *model in self.modelAdditionArray) {

        for (NSInteger i = self.currentPage*PageNumber; i < compareNumber; i ++) {

            CertificateCellModel *modelOne = [self.albumModelArray objectAtIndex:i];

            if ([model.localIdentifier isEqualToString:modelOne.localIdentifier]) {

                NSLog(@"匹配到一张");
                modelOne.cellImageType = CertificateCellImageSelect;
                break;
            }
        }
    }

    // 在第一次添加的时候给一个第一次添加状态,其他的滑动启动这个方法,不会到顶部
    if (self.isFirstAdd) {
        // 数据加载完毕,将页面回到顶部
        self.collectionView.contentOffset=CGPointMake(0, 0);
        self.isFirstAdd = NO;
    }

    // 刷新数据
    [self.collectionView reloadData];
}

获取缩略图方法:

可以传入页面数量和单个相册的相关数据,返回获取的所有图片数据,相册的总页数,相册总图片数,当前处在第几页。

#pragma mark 根据胶卷儿获取缩略图
+ (void)getAlbumThumbnailWithAssetCollection:(PHAssetCollection *)assetCollection withPage:(NSInteger)page andComplete:(void(^)(NSMutableArray *modelArray,NSInteger totalPhotos, NSInteger totalPage, NSInteger currentPage))modelArrayBlock;

#pragma mark 获取所有的缩略图
+ (void)getAlbumThumbnailWithAssetCollection:(PHAssetCollection *)assetCollection withPage:(NSInteger)page andComplete:(void(^)(NSMutableArray *modelArray,NSInteger totalPhotos, NSInteger totalPage, NSInteger currentPage))modelArrayBlock {
    [self enumerateAssetsInAssetCollection:assetCollection original:NO withPage:page andComplete:^(NSMutableArray *modelArray,NSInteger totalPhotos, NSInteger totalPage, NSInteger currentPage) {
        modelArrayBlock(modelArray,totalPhotos,totalPage,page);
    }];
}

#pragma mark 缩略图的获取
+ (void)enumerateAssetsInAssetCollection:(PHAssetCollection *)assetCollection original:(BOOL)original withPage:(NSInteger)page andComplete:(void(^)(NSMutableArray *modelArray,NSInteger totalPhotos, NSInteger totalPage, NSInteger currentPage))modelArrayBlock {
    NSLog(@"相簿名:%@", assetCollection.localizedTitle);

    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
    // 同步获得图片, 只会返回1张图片
    options.synchronous = YES;

    // 获得某个相簿中的所有PHAsset对象
    PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];

//    NSLog(@"assets.count ========== %lu",(unsigned long)assets.count);

    /**
     如果我在这里添加一个GCD呢,会怎样呢?先试试
     */

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSMutableArray *modelArray = [NSMutableArray array];
        NSUInteger totalPage = assets.count/PageNumber;

        if (assets.count % PageNumber) {
            totalPage ++;
        }

        for (NSInteger i = page*PageNumber; i < page*PageNumber + PageNumber; i ++) {

            if (i >= assets.count) {
                break;
            } else {

                PHAsset *asset = [assets objectAtIndex:assets.count-i-1];
                // 是否要原图
                CGSize size = original ? CGSizeMake(asset.pixelWidth, asset.pixelHeight) : CGSizeMake(125, 125);

                // 从asset中获得图片
                [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

                    /**
                     为了优化,直接将model在这里创建
                     */

                    CertificateCellModel *model = [[CertificateCellModel alloc] init];
                    model.itemImage = result;
                    model.page = page;
                    model.assetCollection = assetCollection;
                    model.localIdentifier = asset.localIdentifier;
                    model.cellImageType = CertificateCellImageDeselect;
                    [modelArray addObject:model];
                }];
            }
        }

        dispatch_async(dispatch_get_main_queue(), ^{

            modelArrayBlock(modelArray, assets.count, totalPage, page);
            //回到主线程
        });

    });
}
6> 在定制相册中点击选中时,去获取原图,由于原图有时候会特别特别大,所以取原图时对原图进行处理,使其又相对清晰
#pragma mark 获取指定某张图片的原图
+ (void)photoWithAssetCollection:(PHAssetCollection *)assetCollection withLocalIdentifier:(NSString *)localIdentifier andPage:(NSInteger)page withBlcok:(void(^)(UIImage *bigImage))bigImage;

#pragma mark 获取单张原图
/**
 基本逻辑:
 首先知道相册,然后再知道相册中的第几个,那么直接匹配localIdentifier即可
 */
+ (void)photoWithAssetCollection:(PHAssetCollection *)assetCollection withLocalIdentifier:(NSString *)localIdentifier andPage:(NSInteger)page withBlcok:(void(^)(UIImage *bigImage))bigImage {

    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
    // 同步获得图片, 只会返回1张图片
    options.synchronous = YES;

    // 获得某个相簿中的所有PHAsset对象
    PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];


    for (NSInteger i = page*PageNumber; i < page*PageNumber + PageNumber; i ++) {

        if (i >= assets.count) {
            break;
        } else {

            PHAsset *asset = [assets objectAtIndex:assets.count-i-1];
            // 是否要原图
            if ([asset.localIdentifier isEqualToString:localIdentifier]) {

                // 是否要原图
                CGSize size = CGSizeMake(480.0, 640.0);

                if (asset.pixelWidth > 480 || asset.pixelHeight > 640) {
                    size = CGSizeMake(480.0, 640.0);
                } else {
                    size = CGSizeMake(asset.pixelWidth, asset.pixelHeight);
                }

                // 从asset中获得图片
                [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

                    bigImage(result);
                }];
                break;
            }
        }
    }
}

保存图片到相册

#pragma mark 保存图片
+ (void)saveImage:(UIImage *)image withLocalIdentifier:(void(^)(NSString *localIdentifier))localIdentifier;

#pragma mark 保存图片
+ (void)saveImage:(UIImage *)image withLocalIdentifier:(void(^)(NSString *localIdentifier))localIdentifier {

//    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

    __block NSString *assetId = nil;

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ // 这个block里保存一些"修改"性质的代码
        // 新建一个PHAssetCreationRequest对象, 保存图片到"相机胶卷"
        // 返回PHAsset(图片)的字符串标识
        assetId = [PHAssetCreationRequest creationRequestForAssetFromImage:image].placeholderForCreatedAsset.localIdentifier;

    } completionHandler:^(BOOL success, NSError * _Nullable error) {
        if (error) {
            NSLog(@"保存图片到相机胶卷中失败");
            return;
        }

        localIdentifier(assetId); // 将图片保存到相册中,并获取其唯一标识assetId及localIdentifier,用于后期的筛选
        NSLog(@"成功保存图片到相机胶卷中");
    }];

}
tp5框架完整版 tp5框架的完整版!解压即可使用,简便,快捷,实用。包涵基层 立即下载

相关推荐

IOS基于Photo框架获取本机相册

IOS基于Photo、PhotoUI照片框架获取本机相册.zip

iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文《iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)》,主要是干货环节,列举了如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法。 三. 常用方法的封装

jeffasd的专栏 1510

S32K3xx系列DMA驱动实战:EB配置与Mcal接口应用全解析(含Adc硬件触发示例)

本文深入解析S32K3xx系列MCU的DMA驱动开发,涵盖EB工具配置与Mcal接口应用,特别包含ADC硬件触发示例。通过详细架构分析、实战配置步骤和工业级应用案例,帮助开发者掌握AUTOSAR环境下DMA高效数据传输技术,提升汽车电子和工业控制系统的性能。

weixin_29162439的博客 463

Photos框架 - 自定义媒体资源选择器(数据部分)

我们从自定义个媒体选择器入手,来探讨一些Photos框架的用法,本篇博客我们主要介绍了使用Photos获取相册权限,读取媒体数据,以及如何配置读取的数据参数。下一篇博客我们将开始使用这些数据来构建一个媒体资源选择器的UI页面。

weixin_39339407的博客 1386

cadence capture CIS 之使用access创建数据库(.mdb)

cadence capture CIS 之使用access创建数据库(.mdb)准备工作新建数据库 准备工作 1、一台电脑; 2、安装 Microsoft access database; 新建数据库 打开你准备创建数据库的位置,右键单击——》新建——》 Microsoft access database(注意:文件格式要选*.mdb) 打开数据库文件,创建——》表; 对数据表进行编辑,编辑表头、编辑表的内容、增加表的数量; 编辑表头:选中要编辑的表——》表设计 编辑内容:类似于excel添

weixin_42256550的博客 3147

【Qualcomm高通音频】音效调试_录音文件播放有杂音,如何定位原因?

一、录音播放数据处理过程介绍 (1)TX方向 麦克风(硅麦克风或者主机体麦克风)采集模拟音频信号,经过内部CODEC芯片中的adc转换为数字信号,在经过高通音频DSP处理音效后编码为wav/aac/amr/mp3等格式文件。 (2)RX方向 音频文件经过解码、重采样还原为pcm数据,经过DSP处理音效后送到内部CODEC,然后经过DAC转换为模拟信号,送到喇叭。 二、分析步骤 1...

crow_ch的博客 5971

PHP之ThinkPHP框架

一、框架概述 1、什么是框架 框架就是一些代码类、方法(函数)、变量、常量的集合,这些代码是功能结构性的代码(并非业务代码)。业务代码其实就是具体的一些模块的增删改查逻辑代码。 使用框架开发项目,有便于代码重用、开发效率高、代码规范好、便于功能扩展等优点。 2、php中的主流框架 Zend Frameword框架,PHP官方框架 YII框架,又叫易框架 Symfony框架。通常用于借鉴引用 Laravel框架,市场使用较多 CodeIgniter框架,简称CI框架 ThinkPHP框架,简称TP框架,常

学习记录 2638

基于ADS的低噪声放大电路设计

1. 低噪声放大器设计理论基础 1.1 低噪声放大器在通信系统中的作用 低噪声放大器的主要作用是放大天线从空中接收到的微弱信号,减小噪声干扰,以供系统解调出所需的信息数据。当今,人们对于各种无线通信工具的要求越来越高,如功率辐射要小、作用距离要远、覆盖范围要广等,这就对系统的接收灵敏度提出了更高的要求,系统接收灵敏度的计算公式为: Smin⁡=−144(dBmHz)+NF+10lg⁡BW(MHz)+SN(dB) {S_{\min }} = - 144\left( {\frac{{{\rm{dBm}}}}{

ASH_GUARDIAN的博客 4万+

iOS之相册新框架<Photos/Photos.h>

iOS8以后的照片新框架详细介绍

人生如戏 戏如人生 6970

如何实现三种不同RAM?(单端口RAM、伪双端口RAM、真双端口RAM|verilog代码|Testbench|仿真结果)

RAM(随机存取存储器)是计算机系统中的一种主要存储器件,用于存储和读取数据。在RAM中,单端口RAM(Single-port RAM)和双端口RAM(Dual-port RAM)是两种常见的类型,双端口RAM又分为真双端口(True dual-port RAM)和伪双端口RAM(Simple dual-port RAM)。那么什么是单端口和双端口?又该如何区分真双端口和伪双端口?输入只有一组数据线和一组地址线,读写共用地址线,输出只有一个端口。

Loudrs的博客 1万+

RT-DETR改进策略【独家融合改进】| SPD-Conv+PPA 再次提升模型针对小目标的特征提取能力

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 1153

Swift基础(三十三)Photos.framework框架

class ViewController: UIViewController {     var oneImageView: UIImageView?          override func viewDidLoad() {         super.viewDidLoad()         // Do any additional setup after loading t

HumorousGhost 720

31、车载通信中的可见光通信(VLC)技术解析

本文详细解析了车载通信中可见光通信(VLC)技术的应用背景、优势及发展前景。对比传统RF通信技术(如DSRC),VLC利用LED照明设备实现高效、安全的车辆与车辆、车辆与基础设施之间的通信,具有频谱资源丰富、安全性高、无电磁干扰等优势。文章还探讨了VLC在交叉口交通控制、高速公路通信、自动驾驶等场景的应用潜力,展望了其在未来智能交通系统中的重要作用。

hill8的博客 318

Photos 框架实践以及坑

导读 对于 Photos 框架的介绍,推荐观看 objccn.io 的文章。写得真好,我写得的文章水准还差得老远啊。本文总结了近期使用 Photos 框架编写一个相册的经验,目前还有很大一部分的框架内容没有涉及到,后续会更新内容。 获取资源 照片库中有两种资源可供获取:PHAsset和PHCollection,前者代表图像或视频对象,后者是前者的集合或自身类型的集合。PHColl

FFCoding的博客 830

Unity 如何使用命令模式

命令模式 游戏中,当你想通过一种通用的方式来存储命令并能够撤消命令时,那么命令模式最有用。 在“示例”中,你将看到一个可以通过GUI按钮移动的简单点。 采取行动后,您可以撤消并重做。我在屏幕上添加了一个简单的OnGUI标签输出,因此您可以看到命令列表,并指出哪个是当前命令。 在此示例中使用了4个类: Command-这是任何命令模式都可以继承的基本结构(抽象类)。您可以在任何项目中使用此类。 MoveCommand-这是从Command类继承的结构,将使用Execute和UnExecute(撤消)。每个移

TxNet 1555

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Photos 框架中 asset 转 iamge

转载于:https://my.oschina.net/u/2613046/blog/995714

chuiteng1610的博客 238

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Photos框架及坑(转自简书)

导读 对于 Photos 框架的介绍,推荐观看 objccn.io 的文章。写得真好,我写得的文章水准还差得老远啊。本文总结了近期使用 Photos 框架编写一个相册的经验,目前还有很大一部分的框架内容没有涉及到,后续会更新内容。 获取资源 照片库中有两种资源可供获取:PHAsset...

chuiteng1610的博客 441

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

记录Photos框架的使用

记录Photos框架的使用 前言 这几天项目里用到了图片选择器,就想把之前项目里用ALAssetsLibrary框架封装的图片选择器拿过来用,但是ALAssetsLibrary框架在9.0之后就被弃用了。所以,就要试试Photos框架了。 在网上找了几篇blog研究了一下,就搞了起来。期间也踩了几个坑,所以开篇记录一下。 第一波 获取用户相册 先介绍一些概念,大家可以参考一下这篇

此处无人的blog 704

在使用Photos框架时获取的图片size不准确问题

在使用Photos框架时获取的图片size不准确问题Photos获取系统相册数组获取相册中所有图片对象 在开发中有自定义相册预览需求,就用了Photos框架获取系统中的相册名称和对应图片,因为有图片编辑裁剪需求,要根据图片的size变化编辑框。 Photos获取系统相册数组 PHFetchResult * sysfetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum sub

wwOok 569
上一篇: 测试相册相机权限
下一篇: 重力感应_图片旋转
瓦怕落地
博客等级 码龄11年 16粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值