专栏首页正则ios 图像处理
原创

ios 图像处理

1.UIKit绘图

// 获取当前上下文

CGContextRef context = UIGraphicsGetCurrentContext();

// 移动画笔

CGContextMoveToPoint

// 在画笔位置与point之间添加将要绘制线段 (在draw时才是真正绘制出来)

CGContextAddLineToPoint

// 绘制椭圆

CGContextAddEllipseInRect

CGContextFillEllipseInRect

// 设置线条末端形状

CGContextSetLineCap

// 画虚线

CGContextSetLineDash

// 画矩形

CGContextAddRect

CGContextStrokeRect

CGContextStrokeRectWithWidth

// 画一些线段

CGContextStrokeLineSegments

// 画弧: 以(x1, y1)为圆心radius半径,startAngle和endAngle为弧度

CGContextAddArc(context, x1, y1, radius, startAngle, endAngle, clockwise);

// 先画两条线从point 到 (x1, y1) , 从(x1, y1) 到(x2, y2) 的线  切里面的圆

CGContextAddArcToPoint(context, x1, y1,  x2,  y2, radius);

// 设置阴影

CGContextSetShadowWithColor

// 设置填充颜色

CGContextSetRGBFillColor

// 设置画笔颜色

CGContextSetRGBStrokeColor

// 设置填充颜色空间

CGContextSetFillColorSpace

// 设置画笔颜色空间

CGConextSetStrokeColorSpace

// 以当前颜色填充rect

CGContextFillRect

// 设置透明度

CGContextSetAlaha

// 设置线的宽度

CGContextSetLineWidth

// 画多个矩形

CGContextAddRects

// 画曲线

CGContextAddQuadCurveToPoint

// 开始绘制图片

CGContextStrokePath

// 设置绘制模式

CGContextDrawPath

枚举如下

CGPathDrawingMode

kCGPathFill,//只有填充(非零缠绕数填充),不绘制边框 

kCGPathEOFill,//奇偶规则填充(多条路径交叉时,奇数交叉填充,偶交叉不填充)

kCGPathStroke,        // 只有边框 

kCGPathFillStroke,    // 既有边框又有填充 

kCGPathEOFillStroke  // 奇偶填充并绘制边框 

// 封闭当前线路

CGContextClosePath

// 反转画布

CGContextTranslateCTM(context, 0, rect.size.height); CGContextScaleCTM(context, 1.0, -1.0);

// 从原图片中取小图

CGImageCreateWithImageInRect

// 画图片

CGImageRef image=CGImageRetain(img.CGImage);

CGContextDrawImage(context, CGRectMake(10.0, height - 100.0, 90.0, 90.0), image);

// 实现渐变颜色填充

CGContextDrawLinearGradient(context, gradient, CGPointMake(0.0, 0.0) ,CGPointMake(0.0, self.frame.size.height), kCGGradientDrawsBeforeStartLocation);

———————UIBezierPath———————

通过一个矩形, 创建并且返回一个新的 UIBezierPath 对象

+ (instancetype)bezierPathWithRect:(CGRect)rect;

通过一个指定的矩形中的椭圆形, 创建并且返回一个新的 UIBezierPath 对象

+ (instancetype)bezierPathWithOvalInRect:(CGRect)rect;

圆角矩形, 创建并且返回一个新的 UIBezierPath 对象

+ (instancetype) bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius;

自定义设置圆角矩形, 创建并且返回一个新的 UIBezierPath 对象

+ (instancetype) bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii;

通过一个圆弧, 创建并且返回一个新的 UIBezierPath 对象

+ (instancetype) bezierPathWithArcCenter:(CGPoint)center     //圆心

                                  radius:(CGFloat)radius     //半径

                              startAngle:(CGFloat)startAngle //开始角度 2π最大

                                endAngle:(CGFloat)endAngle   //结束角度

                               clockwise:(BOOL)clockwise;    //true =顺时针or false = 逆时针

通过一个 CGPath, 创建并且返回一个新的 UIBezierPath 对象

+ (instancetype) bezierPathWithCGPath:(CGPathRef)CGPath; //CGPath是UIBezierPath的一个只读属性,通常获取一个UIBezierPath对象的path可以给其他地方用比如上面例子中的 maskLayer.path = maskPath.CGPath;

创建并返回一个新的BezierPath, 这个 BezierPath 的方向是原 BezierPath 的反方向

- (UIBezierPath *) bezierPathByReversingPath; //这里的反方向指的是初始位置和末位置调换,而不是图形反向,比如一条路径是从(0,0)到(3,4),(0,0)是初始位置,(3,4)是末位置,如果使用此方法,则新的UIBezierPath对象的初始位置为(3,4),末位置是(0,0),但是两条直线看上去是一模一样的

将 UIBezierPath 对象的 currentPoint 移动到指定的点

- (void)moveToPoint:(CGPoint)point;

在当前子路径中追加一条直线

- (void)addLineToPoint:(CGPoint)point;

在当前子路径中追加一条圆弧

- (void)addArcWithCenter:(CGPoint)center

                  radius:(CGFloat)radius

              startAngle:(CGFloat)startAngle

                endAngle:(CGFloat)endAngle

               clockwise:(BOOL)clockwise NS_AVAILABLE_IOS(4_0);

在当前 子路经中追加一条 二次贝塞尔曲线

- (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint;

在当前 子路经中追加一条 三次贝塞尔曲线

- (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2;

关闭当前子路经

- (void)closePath; //意思就是闭合路径,初始位置和末位置点连成直线,形成闭合的状态

删除 UIBezierPath 对象中的所有点, 效果也就等同于删除了所有子路经

- (void)removeAllPoints;

将指定 UIBezierPath 中的内容添加到当前 UIBezierPath 对象中

- (void)appendPath:(UIBezierPath *)bezierPath; //该方法将会在当前 UIBezierPath 对象的路径中追加

UIBezierPath的属性

CGPath ->

/** * 获取这个属性, 你将会获得一个不可变的 CGPathRef 对象, * 他可以传入 CoreGraphics 提供的函数中 * 你可以是用 CoreGraphics 框架提供的方法创建一个路径, * 并给这个属性赋值, 当时设置了一个新的路径后, * 这个将会对你给出的路径对象进行 Copy 操作 */

currentPoint ->

/**

  * 该属性的值, 将会是下一条绘制的直线或曲线的起始点.

  * 如果当前路径为空, 那么该属性的值将会是 CGPointZero

  */

lineWidth ->

/**

  * 线宽属性定义了 `UIBezierPath` 对象中绘制的曲线规格. 默认为: 1.0

  */

lineCapStyle ->

/**

  * 该属性应用于曲线的终点和起点. 该属性在一个闭合子路经中是无效果的. 默认为: kCGLineCapButt

  */

/* Line cap styles. */

typedef CF_ENUM(int32_t, CGLineCap) {

    kCGLineCapButt,

    kCGLineCapRound,

    kCGLineCapSquare

};

lineJoinStyle -> // 曲线连接点样式

/* Line join styles. */

typedef CF_ENUM(int32_t, CGLineJoin) {

    kCGLineJoinMiter, 

    kCGLineJoinRound,

    kCGLineJoinBevel

};

miterLimit -> // 内角和外角距离

/** * 两条线交汇处内角和外角之间的最大距离, 只有当连接点样式为 kCGLineJoinMiter * 时才会生效,最大限制为10 * 我们都知道, 两条直线相交时, 夹角越小, 斜接长度就越大. * 该属性就是用来控制最大斜接长度的. * 当我们设置了该属性, 如果斜接长度超过我们设置的范围, * 则连接处将会以 kCGLineJoinBevel 连接类型进行显示. */

flatness -> // 渲染精度

/** * 该属性用来确定渲染曲线路径的精确度. * 该属性的值用来测量真实曲线的点和渲染曲线的点的最大允许距离. * 值越小, 渲染精度越高, 会产生相对更平滑的曲线, 但是需要花费更 * 多的计算时间. 值越大导致则会降低渲染精度, 这会使得渲染的更迅 * 速. flatness 的默认值为 0.6. * Note: 大多数情况下, 我们都不需要修改这个属性的值. 然而当我们 * 希望以最小的消耗去绘制一个临时的曲线时, 我们也许会临时增 * 大这个值, 来获得更快的渲染速度. */

usesEvenOddFillRule -> //是否使用基偶填充规则

/**

  * 设置为 YES, 则路径将会使用 基偶规则 (even-odd) 进行填充.

  * 设置为 NO,  则路径将会使用 非零规则 (non-zero) 规则进行填充.

  */

奇偶原则: 从路径覆盖范围内的任意一点做一条射线(确保这条射线的长度要比路径覆盖范围要大) , 如果与该射线相交的边的数量为奇数, 则该点是路径的内部点, 反之该点则是路径的外部点.

非零环绕数原则: 在我们脑海中定义一个变量, 比如叫:count, 然后从路径覆盖范围内的任意一点做一条射线(确保这条射线的长度要比路径覆盖范围要大). 然后我们对每一条和该射线相交的路径进行统计, 统计规则是这样的: 当路径是从右向左穿过射线的时候, count++, 当路径是从左向右穿过射线的时候, count--. 当我们统计完所有相交的路径后, 如果 count 不为0, 则该点是内部点, 该点所在的封闭区域需要填充, 反之该点则是路径的外部点.

/**

  * @param pattern: 该属性是一个 C 语言的数组, 其中每一个元素都是 CGFloat

  *                 数组中的元素代表着线段每一部分的长度, 第一个元素代表线段的第一条线,

  *                 第二个元素代表线段中的第一个间隙. 这个数组中的值是轮流的. 来解释一下

  *                 什么叫轮流的.

  *                 举个例子: 声明一个数组 CGFloat dash[] = @{3.0, 1.0};

  *                 这意味着绘制的虚线的第一部分长度为3.0, 第一个间隙长度为1.0, 虚线的

  *                 第二部分长度为3.0, 第二个间隙长度为1.0. 以此类推.

  * @param count: 这个参数是 pattern 数组的个数

  * @param phase: 这个参数代表着, 虚线从哪里开始绘制.

  *                 举个例子: 这是 phase 为 7. pattern[] = @{8.0,3.0,16.0,7.0}; 那么虚线将会从第7个像素开始,由于第一个实线的长度是8像素,所以会先显示1像素实线,然后3像素空白,16像素实线,7像素空白,8像素实线,3像素空白……

  */

- (void)setLineDash:(const CGFloat *)pattern

              count:(NSInteger)count

              phase:(CGFloat)phase;  -> // 虚线

/**

  * 该方法可以重新获取之前设置过的虚线样式.

  *  Note:  pattern 这个参数的容量必须大于该方法返回数组的容量.

  *         如果无法确定数组的容量, 那么可以调用两次该方法, 第一次

  *         调用该方法的时候, 传入 count 参数, 然后在用 count 参数

  *         来申请 pattern 数组的内存空间. 然后再第二次正常的调用该方法

  */

- (void)getLineDash:(CGFloat *)pattern

              count:(NSInteger *)count

              phase:(CGFloat *)phase; -> // 重新获取虚线的模式

/**

  * 该方法当前的填充颜色 和 绘图属性对路径的封闭区域进行填充.

  * 如果当前路径是一条开放路径, 该方法将会隐式的将路径进行关闭后进行填充

  * 该方法在进行填充操作之前, 会自动保存当前绘图的状态, 所以我们不需要

  * 自己手动的去保存绘图状态了.

  */

- (void)fill;

/**

  * 该方法当前的填充颜色 和 绘图属性 (外加指定的混合模式 和 透明度)

  * 对路径的封闭区域进行填充. 如果当前路径是一条开放路径, 该方法将

  * 会隐式的将路径进行关闭后进行填充

  * 该方法在进行填充操作之前, 会自动保存当前绘图的状态, 所以我们不需要

  * 自己手动的去保存绘图状态了.

  *

  * @param blendMode: 混合模式决定了如何和已经存在的被渲染过的内容进行合成

  * @param alpha: 填充路径时的透明度

  */

- (void)fillWithBlendMode:(CGBlendMode)blendMode

                    alpha:(CGFloat)alpha;

- (void)stroke; // 绘制路径

/**

  * @param blendMode: 混合模式决定了如何和已经存在的被渲染过的内容进行合成

  * @param alpha: 填充路径时的透明度

  */

- (void)strokeWithBlendMode:(CGBlendMode)blendMode

                      alpha:(CGFloat)alpha;

/**

  *  该方法返回一个布尔值, 当曲线的覆盖区域包含

  * 指定的点(内部点), 则返回 YES, 否则返回 NO.

  * Note: 如果当前的路径是一个开放的路径, 那么

  *       就算指定点在路径覆盖范围内, 该方法仍然会

  *       返回 NO, 所以如果你想判断一个点是否在一个

  *       开放路径的范围内时, 你需要先Copy一份路径,

  *       并调用 -(void)closePath; 将路径封闭, 然后

  *       再调用此方法来判断指定点是否是内部点.

  * @param point: 指定点.

  */

- (BOOL) containsPoint:(CGPoint)point;

/**

  * 检测当前路径是否绘制过直线或曲线.

  * Note: 记住, 就算你仅仅调用了 moveToPoint 方法

  *       那么当前路径也被看做不为空.

  */

@property (readonly, getter=isEmpty) BOOL empty;

/**

  * 该属性描述的是一个能够完全包含路径中所有点

  *  的一个最小的矩形区域. 该区域包含二次贝塞尔

  *  曲线和三次贝塞尔曲线的控制点.

  */

@property (nonatomic, readonly) CGRect bounds;

/**

  * 该方法将会直接对路径中的所有点进行指定的放射

  * 变换操作.

  */

- (void)applyTransform:(CGAffineTransform)transform;

NS_ASSUME_NONNULL_BEGIN

CA_CLASS_AVAILABLE (10.6, 3.0, 9.0, 2.0)

@interface CAShapeLayer : CALayer

//CGPathRef路径,不支持隐式动画

@property(nullable) CGPathRef path;

//填充颜色

@property(nullable) CGColorRef fillColor;

//填充规则(默认是非零法则) 齐偶原则

@property(copy) NSString *fillRule;

//路径颜色

@property(nullable) CGColorRef strokeColor;

//部分绘制[0-1],开始值和结束值

@property CGFloat strokeStart;

@property CGFloat strokeEnd;

//先宽

@property CGFloat lineWidth;

//内角和外角距离

@property CGFloat miterLimit;

//线端口类型

@property(copy) NSString *lineCap;

//线连接处类型

@property(copy) NSString *lineJoin;

//绘制虚线路径

//线型模板的起始位置

@property CGFloat lineDashPhase;

//线型模板 数组实线和虚线循环

@property(nullable, copy) NSArray<NSNumber *> *lineDashPattern;

@end

/* `fillRule' values. */

CA_EXTERN NSString *const kCAFillRuleNonZero    //非零

CA_AVAILABLE_STARTING (10.6, 3.0, 9.0, 2.0);

CA_EXTERN NSString *const kCAFillRuleEvenOdd    //齐偶

CA_AVAILABLE_STARTING (10.6, 3.0, 9.0, 2.0);

/* `lineJoin' values. */

CA_EXTERN NSString *const kCALineJoinMiter

CA_AVAILABLE_STARTING (10.6, 3.0, 9.0, 2.0);

CA_EXTERN NSString *const kCALineJoinRound

CA_AVAILABLE_STARTING (10.6, 3.0, 9.0, 2.0);

CA_EXTERN NSString *const kCALineJoinBevel

CA_AVAILABLE_STARTING (10.6, 3.0, 9.0, 2.0);

/* `lineCap' values. */

CA_EXTERN NSString *const kCALineCapButt

CA_AVAILABLE_STARTING (10.6, 3.0, 9.0, 2.0);

CA_EXTERN NSString *const kCALineCapRound

CA_AVAILABLE_STARTING (10.6, 3.0, 9.0, 2.0);

CA_EXTERN NSString *const kCALineCapSquare

CA_AVAILABLE_STARTING (10.6, 3.0, 9.0, 2.0);

NS_ASSUME_NONNULL_END

2.Core Graphics绘图

3.Core Animation

4.Core Image

5.OpenGL ES绘图

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS 图像处理技术追踪-Core Image

    Core Image 是苹果官方提供的图像处理框架,通过丰富的 built-in(内置)或自定义 Filter(过滤器)高效处理静态图片、动态图片或视频。开发者...

    ios-lan
  • iOS图像处理系列 - GPUImage源码解读(二)

    导语 :billzbwang写的《iOS 图像处理系列 - GPUImage源码解读(一)》里详细地介绍了核心代码的具体实现,对GPUImage的使用者有很大的...

    天天P图攻城狮
  • iOS图像处理系列 - 双重曝光技术的GPUImage实现

    多重曝光是一种拍摄技法,不过为了烘托气氛,常常选择这种技法,多重曝光技术一般用来拍摄双影或多影照片。可以拍摄出魔术般无中生有的效果,这也正是它的独具魅力之处,所...

    天天P图攻城狮
  • iOS 图像处理系列 - 基于GPUImage的滤镜实现及优化

    我们知道,对于图像处理中,滤镜效果是一种最普遍也最有效的图像优化方式。通过对图像进行不同的滤镜效果的处理,可以得到各种绚丽的图片。

    天天P图攻城狮
  • iOS开发常用之图像浏览及处理

    GuangdongQi
  • Python-OpenCV 处理图像(七):图像灰度化处理

    灰度数字图像是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度。

    bear_fish
  • DSP图像处理

    最近着手把CSK移植到DSP中,先看一些DSP中图像处理的一些例子,第一件事当然就是怎么把图像数据倒入CCS工程中了,去年倒是用过一点CCS,再拿起来已经忘得差...

    和蔼的zhxing
  • Python图像处理

    本章开始学习Python图像处理,需要同学们理解如何使用Pillow来操作图像,实现格式转换,改变大小尺寸,裁剪,滤镜处理。

    诸葛青云
  • iOS中使用像素位图(CGImageRef)对图片进行处理

    CGImageRef是定义在QuartzCore框架中的一个结构体指针,用C语言编写。在CGImage.h文件中,我们可以看到下面的定义:

    珲少
  • iOS开发CoreGraphics核心图形框架之七——图像处理

        位图图像数据实际上一个像素阵列,其中每个像素代表了图像中的一个点。位图实际上只支持矩形区域的渲染,但是使用透明技术可以实现任意形状图像的渲染。开发者也可...

    珲少
  • iOS 事件处理机制与图像渲染过程

    致歉声明: Peter在开发公众号功能时触发了一个bug,导致群发错误。对此我们深表歉意,并果断开除了Peter。以下交回给正文时间: iOS 事件处理机制与...

    微信终端开发团队
  • python图像处理-滤镜处理

    本系列课程是针对无基础的,争取用简单明了的语言来讲解,学习前需要具备基本的电脑操作能力,准备一个已安装python环境的电脑。如果觉得好可以分享转发,有问题的地...

    叶子陪你玩
  • python图像处理-贴图

    本系列课程是针对无基础的,争取用简单明了的语言来讲解,学习前需要具备基本的电脑操作能力,准备一个已安装python环境的电脑。如果觉得好可以分享转发,有问题的地...

    叶子陪你玩
  • PHP图形图像处理

    当图像处理完成后,可以使用imagedestroy()函数销毁图像资源来释放内存。

    白胡杨同学
  • OpenCV图像处理05-图像操作

    yangjiao
  • OpenCV图像处理06-图像混合

    yangjiao
  • C#图像处理——ImageProcessor

    这是个老生常谈的话题,需求实在太多,而且也较简单,写此文也是因为几个月没写技术文章了,权当为下一步开个头。我之前也做过很多此类项目,但是就我自己来说每次处理方式...

    魏守峰
  • 数字图像处理

    lwen
  • PhalApi-Image -- 图像处理

    #PhalApi-Image -- 图像处理 ? ##前言 因为在工作中遇到了需要按照尺寸压缩上传图片,进过了一番寻找发现ThinkPhP图形处理能够满足大部分...

    喵了个咪233

扫码关注云+社区

领取腾讯云代金券