UIGraphicsBeginImageContextWithOptions,本文主要在图片类型上下文中对图片进行操作,具体实现的功能:

  •  - 1.生成图片
  •  - 2.绘制图片到视图
  • - 3.添加水印
  • - 4.截取屏幕或者相应view
  • - 5.图片擦除
  • - 6.图片裁剪

具体的方法使用就在方法的介绍中解释吧,为了代码的复用,对上述方法进行了封装,放在UIImage的类别中,方便今后使用。

图片操作的基本步骤

.开启图形上下文
.绘制图片
- 使用drowInRect或者drawAtPoint绘制图片(区别在哪儿?你可以先想一想)
drawInRect是以rect作为图片绘制的区域,图片是以填充的方式被绘制在当前区域图片的大小,rect的宽高比和原图片的宽高比不同时会造成图片的变形
drowAtPoint是以point作为图片绘制的起点,绘制的图片的大小依然是原图片的大小,不会使图片变形
- 将layer渲染在当前上下文
.从当前上下文获取新的图片
.关闭上下文

1.生成图片,这里我们生成特定颜色的图片

+ (UIImage *)createImageColor:(UIColor *)color size:(CGSize)size {
//开启图形上下文
UIGraphicsBeginImageContextWithOptions(size, NO, );
//绘制颜色区域
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(, , size.width, size.height)];
[color setFill];
[path fill];
// CGContextRef ctx = UIGraphicsGetCurrentContext();
// CGContextSetFillColorWithColor(ctx, color.CGColor);
// CGContextFillRect(ctx, CGRectMake(0, 0, size.width, size.height));
//从图形上下文获取图片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
//关闭图形上下文
UIGraphicsEndImageContext(); return newImage;
}

2.绘制图片,可以设置绘制的图片比例或者指定压缩后的图片的大小,可以当做压缩图片使用

+ (UIImage *)scaleImage:(UIImage *)image sclae:(CGFloat)scale {
//确定压缩后的size
CGFloat scaleWidth = image.size.width * scale;
CGFloat scaleHeight = image.size.height * scale;
CGSize scaleSize = CGSizeMake(scaleWidth, scaleHeight);
//开启图形上下文
UIGraphicsBeginImageContext(scaleSize);
//绘制图片
[image drawInRect:CGRectMake(, , scaleWidth, scaleHeight)];
//从图形上下文获取图片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
//关闭图形上下文
UIGraphicsEndImageContext();
return newImage;
}

3.绘制水印

文字水印

可能你在添加文字水印之后,显示文字字体并不是你设置的字体大小,这是因为画布的size是图片的size,绘制后的图片被添加到ImageView上时可能被压缩或者放大,文字也就会发生变化。

+ (UIImage *)waterAtImage:(UIImage *)image
text:(NSString *)text
point:(CGPoint)point
attributes:(NSDictionary *)attributes {
//开启图形上下文
UIGraphicsBeginImageContextWithOptions(image.size, NO, );
//绘制图片
[image drawInRect:CGRectMake(, , image.size.width, image.size.height)];
//添加文字
[text drawAtPoint:point withAttributes:attributes];
//获取图片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文
UIGraphicsEndImageContext();
return newImage;
}

图片水印

+ (UIImage *)waterAtImage:(UIImage *)image
waterImgae:(UIImage *)waterImage
rect:(CGRect)rect {
//开启图形上下文
UIGraphicsBeginImageContextWithOptions(image.size, NO, );
//绘制原图片
[image drawInRect:CGRectMake(, , image.size.width, image.size.width)];
//绘制水印
[waterImage drawInRect:rect]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}

4.截屏

.创建图形上下文

.将view的layer渲染到图形上下文

.从图形上下文得到图片

.关闭图像上下文

//当然如果你只是需要某个view的快照,在iOS7之后你可以使用[view snapshotViewAfterScreenUpdates:NO];来获得,比如实现长按拖拽cell的操作

+ (void)cutView:(UIView *)view success:(void(^)(UIImage *image))success {
//开启图形上下文
UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, );
//获取当前上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//渲染
[view.layer renderInContext:ctx]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); success(newImage);
}

5.擦除

1.设置两张图片,上方为我们要擦除的图片,后方为需要展示的图片
2.设置擦除的区域的大小和位置

+ (UIImage *)wipeView:(UIView *)view
point:(CGPoint)point
size:(CGSize)size {
//开启图形上下文
UIGraphicsBeginImageContext(view.bounds.size);
//获取当前上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//渲染
[view.layer renderInContext:ctx];
//计算擦除的rect
CGFloat clipX = point.x - size.width/;
CGFloat clipY = point.y - size.height/;
CGRect clipRect = CGRectMake(clipX, clipY, size.width, size.height);
//将该区域设置为透明
CGContextClearRect(ctx, clipRect);
//获取新的图片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
return newImage;
}

6.图片裁剪

矩形区域的裁剪,这里我们就利用drowAtPoint的特性去进行裁剪

.假设一张图片的size是(,)
.imageView的size是(,)
.我们选择的裁剪区域是(,,,)
.而我们为了能够保持原来图片的分辨率,在图片不拉伸的情况下在原图片上进行剪裁,所以实际我们在图片上的剪裁区域就是(,,,)
.图片绘制在画布上的点就是(-,-),这样我们不需要进行裁剪就能获得我们想要得到的图片啦
+ (UIImage *)cutImage:(UIImage *)image
imageViewSize:(CGSize)size
clipRect:(CGRect)rect {
//图片大小和实际显示大小的比例
CGFloat scale_width = image.size.width/size.width;
CGFloat scale_height = image.size.height/size.height;
//实际剪切区域
CGRect clipRect = CGRectMake(rect.origin.x * scale_width,
rect.origin.y * scale_height,
rect.size.width * scale_width,
rect.size.height * scale_height); //开启图形上下文
UIGraphicsBeginImageContext(clipRect.size);
//画图
[image drawAtPoint:CGPointMake(-clipRect.origin.x, -clipRect.origin.y)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage;
}

自定义点连线截图

.将自定义点变换到在图片上的点
.计算出自定义点所在的区域rect
.开始图形上下文,rect.size
.绘制path,机型剪裁
.绘图drawAtPoint,x: - rect.origin.x y: - rect.origin.y
.从图形上下文获取图片
.关闭图形上下文
+ (UIImage *)cutImage:(UIImage *)image
imageViewSize:(CGSize)size
clipPoints:(NSArray *)points {
//图片大小和实际显示大小的比例
CGFloat scale_width = image.size.width/size.width;
CGFloat scale_height = image.size.height/size.height; //处理剪裁的点
NSArray *newPoints = [UIImage points:points scalex:scale_width scaleY:scale_height]; //确定上下左右边缘的点
//x升序数组
NSArray *point_x = [newPoints sortedArrayUsingComparator:^NSComparisonResult(NSValue *obj1, NSValue *obj2) {
CGPoint point1 = [obj1 CGPointValue];
CGPoint point2 = [obj2 CGPointValue];
return point1.x > point2.x;
}];
//y升序数组
NSArray *point_y = [newPoints sortedArrayUsingComparator:^NSComparisonResult(NSValue *obj1, NSValue *obj2) {
CGPoint point1 = [obj1 CGPointValue];
CGPoint point2 = [obj2 CGPointValue];
return point1.y > point2.y;
}]; //确定剪切的区域
CGRect clipRect = CGRectMake([point_x.firstObject CGPointValue].x,
[point_y.firstObject CGPointValue].y,
[point_x.lastObject CGPointValue].x - [point_x.firstObject CGPointValue].x,
[point_y.lastObject CGPointValue].y - [point_y.firstObject CGPointValue].y);
//开启图形上下文
UIGraphicsBeginImageContext(clipRect.size); UIBezierPath *path = [UIBezierPath bezierPath];
for (NSInteger i = ; i < newPoints.count; i ++) {
CGPoint point = [newPoints[i] CGPointValue];
if (i == ) {
[path moveToPoint:point];
} else {
[path addLineToPoint:point];
}
}
[path closePath];
[path addClip]; //画图
[image drawAtPoint:CGPointMake(-clipRect.origin.x, -clipRect.origin.y)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
return newImage;
}

原文作者:
作者:莫须有恋
链接:http://www.jianshu.com/p/3baddf100b67

iOS 绘图 (UIImage的一些操作)的更多相关文章

  1. 论文第4章:iOS绘图平台的实现

    面向移动设备的矢量绘图平台设计与实现 Design and Implementation of Mobile Device-oriented Vector Drawing Platform 引用本论文 ...

  2. iOS绘图教程 (转,拷贝以记录)

    本文是<Programming iOS5>中Drawing一章的翻译,考虑到主题完整性,在翻译过程中我加入了一些书中没有涉及到的内容.希望本文能够对你有所帮助. 转自:http://www ...

  3. iOS绘图教程

    本文是<Programming iOS5>中Drawing一章的翻译,考虑到主题完整性,翻译版本中加入了一些书中未涉及到的内容.希望本文能够对你有所帮助.(本文由海水的味道翻译整理,转载请 ...

  4. iOS绘图框架CoreGraphics分析

    由于CoreGraphics框架有太多的API,对于初次接触或者对该框架不是十分了解的人,在绘图时,对API的选择会感到有些迷茫,甚至会觉得iOS的图形绘制有些繁琐.因此,本文主要介绍一下iOS的绘图 ...

  5. iOS绘图系统UIKit与Core Graphics

    概述 iOS主要的绘图系统有UIKit,Core Graphics,Core Animation,Core Image,Open GL等,本片博文主要介绍UIKit与Core Graphics的绘图系 ...

  6. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  7. IOS绘图

    #import "ViewController.h" #import "DrawView.h" @interface ViewController () @pr ...

  8. iOS——使用FMDB进行数据库操作(转载)

    iOS 使用FMDB进行数据库操作 https://github.com/ccgus/fmdb [摘要]本文介绍iOS 使用FMDB进行数据库操作,并提供详细的示例代码供参考. FMDB 使用方法 A ...

  9. IOS 绘图教程Quartz2D

    http://www.cocoachina.com/industry/20140115/7703.html http://www.cnblogs.com/wendingding/p/3803020.h ...

随机推荐

  1. java 程序运行的基础知识【Java bytecode】

    聊聊文字,写一篇关于 java 基础知识的博文. JVM 线程栈 到 函数运行 每一个JVM线程来说启动的时候都会创建一个私有的线程栈.一个jvm线程栈用来存储栈帧,jvm线程栈和C语言中的栈很类似, ...

  2. 在python pydev中使用todo标注任务

    在做自动化测试时,有部分代码因需求未定或界面需要更改,代码不做修改或更新,这里就需要用到TODO功能. 在PyCharm中TODO功能很详细,但在pydev中怎么用呢.看了文档后,截图如下: 1.设置 ...

  3. 兵器簿之Alcatraz(插件管理神器)的配置和使用

    Alcatraz是一款开源框架,帮助我们管理和安装Xcode需要的一些插件,很赞,安装也很简单: 终端输入: curl -fsSL https://raw.githubusercontent.com/ ...

  4. 原生JS实现ajax 发送post请求

    1. [代码]原生JS实现ajax 发送post请求 <script> var oStr = ''; var postData = {}; var oAjax = null; //post ...

  5. CvArr* to cv::Mat 转换

    OpenCV中的CvArr*的定义的一个空类型的指针,可以转换为其派生类CvMat和IplImage,那么如何将其转化为cv::Mat呢,其实很简单,只需要一行代码即可: // CvArr *_img ...

  6. EDA优势

    1.提供明确的表述性业务概念 在某些场景下,一个业务概念会被多个流程更改,如果此属性逻辑发生变化,其他关联的流程将无法知晓,导致bug产生 如:出于性能或其他因素考虑下,为A表增加一个冗余字段,操作A ...

  7. 关于jquery的css的一些知识

    Query实例CSS 样式表动态选择本实例主要说的还是jquery的选择器,关于jquery的css的一些知识用类似 $("li").css("cursor", ...

  8. HDU 3746 - Cyclic Nacklace & HDU 1358 - Period - [KMP求最小循环节]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  9. python3学习笔记(4)_function-参数

    #python学习笔记 17/07/10 # !/usr/bin/evn python3 # -*- coding:utf-8 -*- import math #函数 函数的 定义 #定义一个求绝对值 ...

  10. Qt Creator 4.3.0,Quick Designer里面也看以同时看到和编辑qml code了(Qt5.9的配套IDE)

    作者:Summer Fang链接:https://www.zhihu.com/question/60486611/answer/177584284来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...