进阶篇第九期:相册与拍照的后处理

在中级篇里面,已经介绍过相册与拍照的简单使用了,那么接下来我们就来讲一讲它们的后续处理,到底应该怎么做才好呢

首先我们先来讲拍照

还是那个点击使用照片后调用的代理方法中,我们来做以下代码中所提到的事情

 
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker dismissViewControllerAnimated:YES completion:NULL];

    NSString *mediaType = [info valueForKey:UIImagePickerControllerMediaType];
    UIImage *newImage;
    WS(weakSelf);
    if ([mediaType isEqualToString:@"public.image"]) {
        UIImage *originImage = [info objectForKey:UIImagePickerControllerOriginalImage];
        dispatch_sync(dispatch_get_global_queue(0, 0), ^{
            [weakSelf saveImageToPhotos:originImage];
        });
        newImage = [self scaleImage:originImage toScale:0.1];
    }

    [_imageArray addObject:newImage];
}

这个时候,从里面取出的图片是原图,毕竟尺寸、占用内存都比较大,我们需要进行剪切来优化它

 
-(UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize {
    UIGraphicsBeginImageContext(CGSizeMake(image.size.width*scaleSize,image.size.height*scaleSize));
    [image drawInRect:CGRectMake(0, 0, image.size.width * scaleSize, image.size.height *scaleSize)];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return scaledImage;
}

当然了,原图我们也是需要保存到相册里面的,所以我们的保存方法如下

 
- (void)saveImageToPhotos:(UIImage *)savedImage {
    UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
    NSString *message = nil;
    if (error) {
        message = @"保存失败";
    } else {
        message = @"保存成功";
        [self getAssetsLastPhoto];
    }
    NSLog(@"%@", message);
}

这就是拍照后续的使用了,如果还需要优化的话,那就要看你们的产品以及后台如何制定方案了

接下来我们来讲一讲相册吧

最常用的就是我们需要调用一个方法,将所有的照片都取出来,这里要注意的一点是,我们只要缩略图以及原图URL地址就可以了,因为它们两个还是比较重要的

 
- (void)loadAssets {
    
    // Initialise
    _assets = [NSMutableArray new];
    _assetLibrary = [[ALAssetsLibrary alloc] init];
    
    // Run in the background as it takes a while to get all assets from the library
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        NSMutableArray *assetGroups = [[NSMutableArray alloc] init];
        NSMutableArray *assetURLDictionaries = [[NSMutableArray alloc] init];
        
        // Process assets
        void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
            if (result != nil) {
                if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {
                    [assetURLDictionaries addObject:[result valueForProperty:ALAssetPropertyURLs]];
                    NSURL *url = result.defaultRepresentation.url;
                    [_assetLibrary assetForURL:url
                                   resultBlock:^(ALAsset *asset) {
                                       if (asset) {
                                           @synchronized(_assets) {
                                               [_assets addObject:asset];
                                               if (_assets.count == 1) {
                                                   // Added first asset so reload data
                                                   //                                                   [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
                                               }
                                           }
                                       }
                                   }
                                  failureBlock:^(NSError *error){
                                      NSLog(@"operation was not successfull!");
                                  }];
                    
                }
            }
        };
        
        // Process groups
        void (^ assetGroupEnumerator) (ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) {
            if (group != nil) {
                [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:assetEnumerator];
                [assetGroups addObject:group];
            }
        };
        
        // Process!
        [self.assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll
                                         usingBlock:assetGroupEnumerator
                                       failureBlock:^(NSError *error) {
                                           NSLog(@"There is an error");
                                       }];
        
    });
    
}

在显示缩略图的地方,我们可以显示缩略图,而在显示原图的地方,我们也可以根据URL显示原图

 
@synchronized(_assets) {
        NSMutableArray *copy = [_assets copy];
        for (ALAsset *asset in copy) {
            [photos addObject:[MWPhoto photoWithThumbImage:[UIImage imageWithCGImage:asset.thumbnail]  URL:asset.defaultRepresentation.url]];
        }
    }

上面的方法,就是加入原图的缩略图以及地址URL,这里我用了一个包含两个属性的类来添加,当然你也可以弄两个类来单独添加

另外在上传图片的时候还是需要对原图进行剪切,改变base64,当然还是要看你们服务器那边的方案

好啦,这就是我们对相册以及拍照的后处理咯

就写到这里吧,有什么问题,可以来群里找我哦

时间: 2025-01-05 19:03:32

进阶篇第九期:相册与拍照的后处理的相关文章

初级篇第九期:学习相册与拍照

学习建议:自己动手,丰衣足食 学习周期:1周 学习目的:熟练使用相册和拍照 学习答疑:欢迎来技术群里提问并做分享 学习工具:Xcode开发环境 学习内容:熟悉相册与拍照的那点事情 说到相册与拍照,我想对于现在的小伙伴们来讲,可以说是再熟悉不过了,因为每个人都希望用自己的app去拍照,去玩相册,几乎很多很多的APP里面都会有相关的功能,所以对于这方面的内容来讲,是非常非常重要的哦,所以小伙伴们一定要好好学习它哦 其实说它们简单?那真是言之过早,对于相册与拍照的相关优化真的可以说的上是很深的坑哦,一

中级篇第九期:相册与拍照初使用

废话不多说哦,边上代码边解释咯 首先我们来讲调用系统的相机咯          UIImagePickerController *picker = [[UIImagePickerController alloc] init];     picker.delegate = self;     picker.allowsEditing = NO;     picker.sourceType = UIImagePickerControllerSourceTypeCamera;     [self pr

慕课网javascript 进阶篇 第九章 编程练习

把平常撸的码来博客上再撸一遍既可以加深理解,又可以理清思维.还是很纯很纯的小白,各位看官老爷们,不要嫌弃.最近都是晚睡,昨晚也不例外,两点多睡的.故,八点起来的人不是很舒服,脑袋有点晕呼呼,鉴于昨晚看到了这章的编程练习,想着自己DOM编程艺术也差不多看完了,高级3也看了点,所打算开始多敲代码了. 谁知,看着编辑器一脸懵逼,不知道如何啃下这块骨头,米思绪,写着也没什么感觉,索性就不写了,这不下午才来撸它. 要求如下: <!DOCTYPE html> <html> <head&g

经验篇第九期:群里的那点事儿(九)

问题1:记录ScrollView的偏移量 问题2:将钱数的...分隔 问题3:关于下面表达式错误的原因 欢迎小伙伴们常来群里提出技术问题~~并且帮他人解决问题哦

娱乐篇第九期:互联网的事情you意思(九)

哈哈,小弟有跟某个校友开玩笑呢,做了个藏头诗戏弄他 宇宙中心五道口 晨行地铁人茫茫 师大美女多如云 从此帅哥是路人 蓝天白云花儿美 翔鹰横空展翅飞 任其鲜血止不住 性情善变花儿红 这周比较忙,小弟白天都没有抽出额外的时间去看互联网上那些有意思的事情,真是惭愧,但还好,工作任务量并不是很大

随心篇第九期:我不愿一无所有

这周项目组的小组长找我单独聊了天,聊的是关于我们这个项目组未来的趋势,毕竟我们这个项目组只有技术的同事是我们一个组的,其余的同事都是另几个组的,现在要合并成一个大组 听起来还不错,毕竟这个项目组还是蛮有潜力的,但是如果留下来的话,就面临着组长的更换 听到这个消息很伤心,我一时不知道该如何选择,毕竟在之前的小组也半年多了,跟组长相处融洽,而且很多地方都很照顾我,包括工作的事情,我刚毕业,他并不会为难我,我很欣慰,和他相处的这段日子里,我感觉很轻松,很开心,我觉得可以跟着一个相处融洽的领路人,是一件

SQL Server调优系列进阶篇(如何维护数据库索引)

原文:SQL Server调优系列进阶篇(如何维护数据库索引) 前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常维护以及一些注意事项等. 闲言少叙,进入本篇的主题. 技术准备 数据库版本为SQL Server2012,前几篇文章用的是SQL Server2008RT,内容区别不大,利用微软的以前的案例库(Northwind)进行分析,部分内容也会

Python学习笔记进阶篇——总览

Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(多线程与进程池) Python学习笔记——进阶篇[第九周]———线程.进程.协程篇(队列Queue和生产者消费者模型) Python学习笔记——进阶篇[第九周]———协程 Python学习笔记——进阶篇[第九周]———MYSQL操作

Android应用开发进阶篇-场景文字识别

由于研究生毕业项目需要完成一个基于移动终端的场景文字识别系统,虽然离毕业尚早,但出于兴趣的缘故,近一段抽时间完成了这样一套系统.基本的架构如下: 客户端:Android应用实现拍摄场景图片,大致划出感兴趣文字区域,通过socket通信上传服务器端识别; 服务器端:Python server进行socket通信监听,连通后调用文字识别引擎(exe可执行程序),将识别结果返回; 下面是系统运行示例图: 1. 客户端 包含两个Activity,: MainActivity主界面如上图左1,选择拍摄后调