首先这篇博客中有一个比较重要的类是参照一个博客中的因为具体的博客地址忘记了,所以见谅,后期会加上地址
这篇博客主要是对两种获取系统相册以及通过相机拍摄图片处理进行比较,分别是<AssetsLibrary/AssetsLibrary.h>,和<Photos/Photos.h>,并且会提供最新的<Photos/Photos.h>框架的使用demon至于<AssetsLibrary/AssetsLibrary.h>的demon将不会给出,如果有需要的可以私聊我
无论是<AssetsLibrary/AssetsLibrary.h>,还是<Photos/Photos.h>,都需要对系统相册获取的判断:
这里给出的是<Photos/Photos.h>的判断
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied) {
NSLog(@"暂无访问权限");
}else{
}
另外需要实现一个观察着代理,在开启可以访问相册时及时更新
[[PHPhotoLibrary sharedPhotoLibrary]registerChangeObserver:self];
代理方法
-(void)photoLibraryDidChange:(PHChange *)changeInstance{
//从新获取相册,刷新页面
}
相机权限:
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])
{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = sourceType;
if ([[[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."].firstObject integerValue] == 8) {
self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
}
[self presentViewController:picker animated:YES completion:nil];
}else
{
NSLog(@"模拟其中无法打开照相机,请在真机中使用");
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(nonnull NSDictionary<NSString *,id> *)info {
__block UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage];
__weak ViewController *weakSelf = self;
void(^imageBlock)() = ^(UIImage *image){
__strong ViewController *strongSelf = weakSelf;
if (!image) {
image = [info objectForKey:UIImagePickerControllerOriginalImage];
}
[strongSelf.imageArray addObject:image];
};
void(^dismissBlock)() = ^(){//声明
__strong ViewController *strongSelf = weakSelf;
[picker dismissViewControllerAnimated:YES completion:^{
[strongSelf setSpread];
}];
};
//写入本地
[[LHPhotoList sharePhotoTool]saveImageToAblum:originalImage completion:^(BOOL suc, PHAsset *asset) {
if (suc) {//存成功
[[LHPhotoList sharePhotoTool]requestImageForAsset:asset size:CGSizeMake(1080, 1920) resizeMode:PHImageRequestOptionsResizeModeFast completion:^(UIImage *image, NSDictionary *info) {
originalImage = [UIImage imageWithData:UIImageJPEGRepresentation(originalImage, 0.1) scale:originalImage.scale];
imageBlock(originalImage);
dismissBlock();
}];
}else{//存取失败
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
originalImage = [UIImage imageWithData:UIImageJPEGRepresentation(originalImage, 0.1) scale:originalImage.scale];
imageBlock(originalImage);
dispatch_sync(dispatch_get_main_queue(), ^{
dismissBlock();
});
});
}
}];
}
<AssetsLibrary/AssetsLibrary.h>
1.
首先<AssetsLibrary/AssetsLibrary.h>框架获取所有相册的方法:
library = [[ALAssetsLibrary alloc]init];
ALAssetsLibraryGroupsEnumerationResultsBlock resultsBlock = ^(ALAssetsGroup *group,BOOL *stop){
@strongify(self)
if (group) {
[group setAssetsFilter:[ALAssetsFilter allAssets]];
[self.groupList addObject:group];(self.groupList是我们定义的数组)
}else{
}
};
ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error){
ALERT_MSG(@"没有权限访问相册");
};
NSUInteger type = ALAssetsGroupLibrary | ALAssetsGroupAlbum |ALAssetsGroupEvent | ALAssetsGroupFaces | ALAssetsGroupPhotoStream |ALAssetsGroupSavedPhotos;
[library enumerateGroupsWithTypes:type usingBlock:resultsBlock failureBlock:failureBlock];
这里获取的是所有相册的分类。
同时需要执行代理
-(void)getLastImageByGroup:(ALAssetsGroup *)group usingBlock:(void(^)(UIImage *image))block{
void (^selectionBlock)(ALAsset*,NSUInteger,BOOL *) = ^(ALAsset* asset,NSUInteger index,BOOL *innerStop){
if (asset == nil) {
return ;
}
if (block) {
block([UIImage imageWithCGImage:[asset thumbnail]]);
}
};
//设置过滤类型
[group setAssetsFilter:[ALAssetsFilter allPhotos]];
if ([group numberOfAssets] > 0) {
NSUInteger index = [group numberOfAssets] - 1;
NSIndexSet *lastPhotoIndexSet = [NSIndexSet indexSetWithIndex:index];
//枚举最后一个asset
[group enumerateAssetsAtIndexes:lastPhotoIndexSet options:0 usingBlock:selectionBlock];
}
}
2.获取到对应相册里面的所有图片asset
ALAssetsGroupEnumerationResultsBlock resultsBlock = ^(ALAsset *asset,NSUInteger index,BOOL *stop ){
if(asset){
}
}
3.通过asset获取到对应的图片
UIImage *originalImage = [UIImage imageWithCGImage:asset.defaultRepresentation.fullScreenImage];
<Photos/Photos.h>
1.获取相册
//获取所有智能相册
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];
[userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL * _Nonnull stop) {
}
}];
2.通过asset获取
[[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable image, NSDictionary * _Nullable info) {
}];
这里不做过多的说明详细的可以查看demondemon链接地址