OC - 11.使用Quartz2D剪裁图片并保存

实现效果


  • 操作步骤

    • 绘制一个矩形框,弹出一个alertView,提示是否保存图片
    • 点击"是",将图片保存到相册
    • 在相册中查看保存的图片
  • 效果图

实现思路


  • 在控制器的view上添加一个imageView,设置图片
  • 在控制器的view上添加一个pan手势
  • 跟踪pan手势,绘制一个矩形框(图片的剪切区域
  • 在pan手势结束时,通过alertView提示“是否将图片保存至相册?”
    • 点击“是”,保存图片
    • 点击“否”,暂时什么都不做

实现步骤


  • 通过storyboard在控制器的view上添加一个imageView(设置图片),并在控制器的.m文件中拥有该属性

    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
  • 设置通过手势绘制的图片的剪切区域
    • 将图片的剪切区域作为成员属性clipView
    @property (nonatomic, weak) UIView *clipView;
    • 通过懒加载的方式创建clipView,并初始化
    - (UIView *)clipView
    {
    	//如果clipView为被创建,就创建
    	if (_clipView == nil)
    	{
        	UIView *view = [[UIView alloc] init];
        	_clipView = view;
        	//设置clipView的背景色和透明度
        	view.backgroundColor = [UIColor blackColor];
        	view.alpha = 0.5;
        	//将clipView添加到控制器的view上,此时的clipView不会显示(未设置其frame)
        	[self.view addSubview:_clipView];
    	}
    	return _clipView;
    }
  • 给控制器的view添加pan手势,跟踪pan手势,绘制图片剪切区域
    • 创建并添加手势
    /**创建手势**/
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    	/**
    	*每当pan手势的位置发生变化,就会调用pan:方法,并将手势作为参数传递
    	*/
    /**添加手势**/
    [self.view addGestureRecognizer:pan];
    • 增加成员属性,记录pan手势开始的点
    @property (nonatomic, assign) CGPoint startPoint;
    • 监听手势的移动
    - (void)pan:(UIPanGestureRecognizer *)pan
    {
    	CGPoint endPoint = CGPointZero;
    
    	if (pan.state == UIGestureRecognizerStateBegan)
    	{
    		/**开始点击时,记录手势的起点**/
        	self.startPoint = [pan locationInView:self.view];
    	}
    	else if(pan.state == UIGestureRecognizerStateChanged)
    	{
    		/**当手势移动时,动态改变终点的值,并计算起点与终点之间的矩形区域**/
        	endPoint = [pan locationInView:self.view];
        	//计算矩形区域的宽高
        	CGFloat w = endPoint.x - self.startPoint.x;
        	CGFloat h = endPoint.y - self.startPoint.y;
        	//计算矩形区域的frame
        	CGRect clipRect = CGRectMake(self.startPoint.x, self.startPoint.y, w, h);
        	//设置剪切区域的frame
        	self.clipView.frame = clipRect;
    	}
    	else if(pan.state == UIGestureRecognizerStateEnded)
    	{
    		/**若手势停止,将剪切区域的图片内容绘制到图形上下文中**/
    		//开启位图上下文
        	UIGraphicsBeginImageContextWithOptions(self.imageView.bounds.size, NO, 0);
        	//创建大小等于剪切区域大小的封闭路径
        	UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.clipView.frame];
        	//设置超出的内容不显示,
        	[path addClip];
        	//获取绘图上下文
        	CGContextRef context = UIGraphicsGetCurrentContext();
        	//将图片渲染的上下文中
        	[self.imageView.layer renderInContext:context];
        	//获取上下文中的图片
        	UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        	//关闭位图上下文
        	UIGraphicsEndImageContext();
        	//移除剪切区域视图控件,并清空
        	[self.clipView removeFromSuperview];
        	self.clipView = nil;
        	//将图片显示到imageView上
        	self.imageView.image = image;
        	//通过alertView提示用户,是否将图片保存至相册
        	UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"保存图片" message:@"是否将图片保存至相册?" delegate:self cancelButtonTitle:@"否" otherButtonTitles:@"是", nil];
        	[alertView show];
    }
    }
  • 设置alertView的代理方法,确定是否保存图片
    - (void)alertView:(nonnull UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
    	//若点击了“是”,则保存图片
    	if (buttonIndex == 1)
    	{
        	UIImageWriteToSavedPhotosAlbum(self.imageView.image, nil, nil, nil);
        	/**
        	* 该方法可以设置保存完毕调用的方法,此处未进行设置
        	*/
    	}
    }
时间: 2024-10-19 13:14:24

OC - 11.使用Quartz2D剪裁图片并保存的相关文章

iOSQuartz2D-04-手动剪裁图片并保存到相册

实现效果 操作步骤 绘制一个矩形框,弹出一个alertView,提示是否保存图片 点击"是",将图片保存到相册 在相册中查看保存的图片 效果图 实现思路 在控制器的view上添加一个imageView,设置图片 在控制器的view上添加一个pan手势 跟踪pan手势,绘制一个矩形框(图片的剪切区域) 在pan手势结束时,通过alertView提示"是否将图片保存至相册?" 点击"是",保存图片 点击"否",暂时什么都不做 实现

下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片

将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 #region 图片下载[使用流.WebRequest进行保存] 4 /// <summary> 5 /// 图片下载[使用流.WebRequest进行保存] 6 /// </summary> 7 /// <param name="fileUrl">图片URL地址(例如:http://img.baidu.com/video/img/video

安卓开发——拍照、裁剪并保存为头像报错:裁剪图片无法保存的

在做学校大创项目的安卓开发时,需要从相册获取图片或者拍照,然后裁剪保存为头像.由于我是第一次弄安卓开发,也对Android现在越来越多的权限限制不了解,debug过程真的是异常心塞啊. 闲话不说(文末慢慢话痨),我开始是在网上找了一些代码打算用到项目上试试,但是连个拍照或者从相册选择图片都频繁报错(应该还是因为sd卡权限之类的吧),折腾了一晚上没有解决,第二天还是老老实实的看<第一行代码>,边学边写.在这里我简单梳理一下流程(关于裁剪后图片无法保存的问题的解释请直接跳到水平线之后): 调用手机

C#MVC和cropper.js实现剪裁图片ajax上传的弹出层

 首先使用cropper.js插件,能够将剪裁后的图片返回为base64编码,后台根据base64编码解析保存图片. jQuery.cropper: 是一款使用简单且功能强大的图片剪裁jquery插件.该图片剪裁插件支持图片放大缩小,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用 网站:http://fengyuanchen.github.io/cropper/ 可以自己搜索中文API 前台代码: @{ Layout = null; } <!DOCTYPE html> &

python爬取某个网站的图片并保存到本地

python爬取某个网站的图片并保存到本地 #coding:utf-8 import urllib import re import sys reload(sys) sys.setdefaultencoding('gb2312') #获取整个页面的数据 def getHtml (url): page = urllib.urlopen(url) html = page.read() return html #保存图片到本地 def getImg(html): reg = r'src="(.+?\.

c++截取屏幕图片并保存(函数代码实现)

<strong> //获取桌面窗体的CDC CDC *pdeskdc = GetDesktopWindow()->GetDC(); CRect re; //获取窗体的大小 GetDesktopWindow()->GetClientRect(&re); CBitmap bmp; bmp.CreateCompatibleBitmap(pdeskdc , re.Width() , re.Height()); //创建一个兼容的内存画板 CDC memorydc; memorydc

使用URLConnection下载文件或图片并保存到本地

有时候需要从网络上面下载图片到本地进行保存,代码如下: package com.jointsky.jointframe.test; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; /** * 使用URLConnection下载文件或图片并保存到本地. * * @a

解决4.4版本以上剪裁图片时提示无法加载图片的问题

/** * 将uri转换成字符串 * 解决4.4版本以上获取到的uri是图片名称而非图片路径,导致剪裁图片时提示无法加载图片的问题 * 详细的解决方案,请参考这篇文章 * 当安卓的版本比较高时(如4.4),选择本地相册可能会返回“无法加载此图片” * 原因:正常uri是file://...而高版本是content://... * 所以需要一个转换操作 * * @param context * @param uri * @return */ @SuppressLint("NewApi")

使用canvas将网页内容以图片形式保存到服务器端

经过几天的折磨,终于实现了将网页以图片形式保存到服务器端的效果.在这里要特别感谢园子里白灰尘(http://www.cnblogs.com/Wylfocus/)这位朋友热心.耐心的指导.在网上有许多这样的介绍资料,但对于初学者来说,在测试过程中,有时是缺JS库文件.有时是因输入代码时没注意大小写等原因,总会出现这样或那样的错.为了让和我一样的初学者们都顺利看到程序的效果,现在把我试好的程序上传.开发环境为VS2008.特别要注意的是,IE9以下的版本不支持canvas,即使导入explorerc