裁剪相册中的图片并存储在本地

前几天做图片上传的时候获取相册图片时可编辑的图片只能按照图片库的那种样式、比例限制性非常大,所以自己重写了一个来适应一般的头像上传(裁剪框为正方形)。

想法和思路很多参考了此篇文章http://www.cnblogs.com/liulunet/archive/2013/01/19/2866399.html

首先考虑的是裁剪框,裁剪框我是用四个view来做的,在四个角分别添加一个view,中间留一个自定义大小的裁剪框(有更好的方法可以下方留言)

<p class="p1"><pre name="code" class="objc">UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(0, 0, (kSCREENWIDTH+kCUTWIDTH)/2, (kSCREENHEIGHT-kCUTHEIGHT)/2)];
    view1.backgroundColor = [UIColor blackColor];
    view1.alpha = 0.6;
    view1.userInteractionEnabled = NO;//对触摸事件不做出回应
    [self.view addSubview:view1];


 这个一个view的代码   

 

kSCREENWIDTH、kSCREENHEIGHT、kCUTWIDTH、kCUTHEIGHT 分别为屏幕宽高和裁剪框的宽高

图片放在scrollView里面 设置scrollView的contentInset确保不会划出边界还有可以滑到图片的任何地方,另外必须对图片进行判断,尺寸不能太小达不到裁剪框的大小,scrollView的contentSize的大小根据图片的大小来确定,为了设置图片居中显示需要设置contentOffset,另外我还添加了双击放大和缩小的功能,同时记录下图片的缩放的尺寸以备正确裁剪图片的大小

<pre name="code" class="objc">//判断图片是否符合要求
- (BOOL)judgePictureSize:(UIImage *)image{
    BOOL legalPicture = YES;
    CGSize imageSize = image.size;
    if(imageSize.width < kCUTWIDTH || imageSize.height <kCUTHEIGHT){
        legalPicture = NO;
    }else{
        if(imageSize.width > imageSize.height){
            //宽图
            _defaultScale = imageSize.height/kCUTHEIGHT;
            _currentScale = imageSize.height/kCUTHEIGHT;
            _scrollImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, imageSize.width/_currentScale, kCUTHEIGHT)];

        }else{
            //高图
            _defaultScale = imageSize.width/kCUTWIDTH;
            _currentScale = imageSize.width/kCUTWIDTH;
            _scrollImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, kCUTWIDTH, imageSize.height/_currentScale)];

        }
        self.scrollView.maximumZoomScale = _currentScale;
        self.scrollView.minimumZoomScale = 1.0;
    }
    return legalPicture;
}


 //添加scrollView到视图中 
<pre name="code" class="objc">if(!self.scrollView){
        self.scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, kSCREENWIDTH, kSCREENHEIGHT)];
    }
    self.scrollView.backgroundColor = [UIColor blackColor];
    self.scrollView.delegate = self;
    
    
    //双击事件
    UITapGestureRecognizer *doubleTap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(zoomInOrOut:)];
    doubleTap.numberOfTapsRequired=2;
    [self.scrollView addGestureRecognizer:doubleTap];
    [self.view addSubview:self.scrollView];
    
    //self.originalPicture = [UIImage imageNamed:@"icon"];
    _originalImage = self.originalPicture;
    
    if([self judgePictureSize:_originalImage]){
        _scrollImageView.image = _originalImage;
        [self.scrollView addSubview:_scrollImageView];
        //navigationController的高度为64  所以此处-64  
        UIEdgeInsets edgeInset = UIEdgeInsetsMake((kSCREENHEIGHT-kCUTHEIGHT)/2-64, (kSCREENWIDTH-kCUTWIDTH)/2, (kSCREENHEIGHT-kCUTHEIGHT)/2, (kSCREENWIDTH-kCUTWIDTH)/2);
        self.scrollView.contentInset = edgeInset;
        self.scrollView.contentSize = _scrollImageView.frame.size;
        //设置图片居中显示
        self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x+(_scrollImageView.frame.size.width-kCUTWIDTH)/2, self.scrollView.contentOffset.y+(_scrollImageView.frame.size.height-kCUTHEIGHT)/2);
    }else{
        NSLog(@"图片尺寸太小了,换张大图吧!");
    }


 
//scrollView双击缩放
-(void)zoomInOrOut:(UIGestureRecognizer*)tapGesture{
    if(self.scrollView.zoomScale >= _defaultScale){
        [self.scrollView setZoomScale:1.0 animated:YES];
    }else{
        CGPoint point=[tapGesture locationInView:self.scrollView];
        [self.scrollView zoomToRect:CGRectMake(point.x-40, point.y-40, 40, 40) animated:YES];
    }
}

图片缩放弄好后就是裁剪图片和保存裁剪的图片了,裁剪的大小是根据图片缩放的比例、裁剪图片的位置是根据scrollView的contentOffset来的,图片放大倍数越大 裁剪的图片尺寸越小

裁剪图片并保存到沙盒

<pre name="code" class="objc">CGImageRef imageRef = _originalImage.CGImage;
    CGRect cutRect = CGRectMake((self.scrollView.contentOffset.x+(kSCREENWIDTH-kCUTWIDTH)/2)*_currentScale, (self.scrollView.contentOffset.y+(kSCREENHEIGHT-kCUTHEIGHT)/2)*_currentScale, kCUTWIDTH*_currentScale, kCUTHEIGHT*_currentScale);
    NSLog(@"%@",NSStringFromCGRect(cutRect));
    CGImageRef subImageRef = CGImageCreateWithImageInRect(imageRef, cutRect);
    UIGraphicsBeginImageContext(cutRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, cutRect, subImageRef);
    UIImage *returnImage = [UIImage imageWithCGImage:subImageRef];
    UIGraphicsEndImageContext();
    [self savePicToSandbox:returnImage];//保存到沙盒中
    [self dismissViewControllerAnimated:YES completion:nil];


 
//图片保存至沙盒
- (void)savePicToSandbox:(UIImage *)returnImage{
    //获取沙盒目录
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [path objectAtIndex:0];
    //保存图片路径
    NSData *imageData;
    if (UIImagePNGRepresentation(returnImage) == nil) {
        imageData = UIImageJPEGRepresentation(returnImage, 1);
    } else {
        imageData = UIImagePNGRepresentation(returnImage);
    }
    NSString *imagePath = [documentPath stringByAppendingPathComponent:@"headImg.png"];
    NSFileManager *fm = [NSFileManager defaultManager];
    [fm createFileAtPath:imagePath contents:imageData attributes:nil];
    NSLog(@"%@",imagePath);
}

到此就弄好了图片裁剪了。

另外贴上从相册中获取图片的代码

//上传头像
- (IBAction)uploadHeaderImg:(UIButton *)sender{
    UIActionSheet *actSheet = [[UIActionSheet alloc]initWithTitle:@"上传头像" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"拍照" otherButtonTitles:@"相册", nil];
    [actSheet showInView:self.view];
}
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 0){
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        imagePicker.allowsEditing = YES;
        imagePicker.delegate = self;
        [self presentViewController:imagePicker animated:YES completion:nil];
        
    }
    if(buttonIndex == 1){
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
        imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        //imagePicker.allowsEditing = YES;
        imagePicker.delegate = self;
        [self presentViewController:imagePicker animated:YES completion:nil];
    }
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    if (picker.sourceType == UIImagePickerControllerSourceTypeCamera){
        UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage];
        UIImageWriteToSavedPhotosAlbum(originalImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    }
    //获得原始图片并传到裁剪的视图控制器中
    UIImage* image = [info objectForKey: @"UIImagePickerControllerOriginalImage"];
    ImageScrollViewController *imageVC = [[ImageScrollViewController alloc]init];
    imageVC.originalPicture = image;
    [picker pushViewController:imageVC animated:YES];
    
    //[picker dismissViewControllerAnimated:YES completion:nil];
}

以下为实例截图,附上下载链接http://download.csdn.net/detail/u010530716/8365265

















  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
,发送类别,概率,以及物体在相机坐标系下的xyz.zip目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像的目标属于哪个类别。 定位问题:确定目标在图像的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像的目标属于哪个类别。 定位问题:确定目标在图像的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像的目标属于哪个类别。 定位问题:确定目标在图像的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值