IOS图像处理(3)绘制路径

通过路径我们可以实现更加复杂的图形的绘制,比如多边形,弧,圆角矩形等等

- (void)drawRect:(CGRect)rect
{
    //获取图像上下文对象
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(context, 250/255.0, 250/255.0, 250/255.0, 1);
    CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);
    CGContextSetShadowWithColor(context, CGSizeMake(1, 1), 3, [UIColor yellowColor].CGColor);
    CGContextSetLineWidth(context, 2);

    //添加直线(方式1)
    //1,2点组成第一条线段,2,3点组成第二条线段,3,4点组成第3条线段,以此类推
    CGPoint points[] = {CGPointMake(50, 15),CGPointMake(150, 15),CGPointMake(50, 25),CGPointMake(100, 25),CGPointMake(200, 25)};
    CGContextAddLines(context, points, 5);
    CGContextDrawPath(context, kCGPathStroke);

    //添加直线(方式2)
    CGContextMoveToPoint(context, 0, 40);
    CGContextAddLineToPoint(context, 100, 40);
    CGContextAddLineToPoint(context, 100, 50);
    //闭合路径,连接终点和起点
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathStroke);

    //添加矩形
    CGContextAddRect(context, CGRectMake(150, 50, 100, 30));
    CGContextDrawPath(context, kCGPathFill);

    //添加椭圆
    CGContextAddEllipseInRect(context, CGRectMake(0, 50, 100, 30));
    CGContextDrawPath(context, kCGPathStroke);

    //添加弧
    //最后一个参数代表方向,0表示顺时针,1表示逆时针
    CGContextAddArc(context, 100, 150, 30, -90*M_PI/180, 90*M_PI/180, 1);
    CGContextDrawPath(context, kCGPathStroke);

    //添加二次函数曲线
    CGContextMoveToPoint(context, 300, 200);
    CGContextAddQuadCurveToPoint(context, 160, 300, 320, 300);
    CGContextDrawPath(context, kCGPathStroke);

    //添加贝塞尔曲线
    CGContextMoveToPoint(context, 10, 200);
    CGContextAddCurveToPoint(context, 160, 230, 0, 300, 50, 400);
    CGContextDrawPath(context, kCGPathStroke);

}

运行结果

由上例可以看出使用路径可以很方便的绘制基础的几何图形以及画弧,通过组合这些几何图形可以实现更加复杂的图像,下面的代码分别实现了圆角矩形,多角形的绘制

//绘制圆角矩形
//rect表示矩形区域,radius表示圆角半径
void drawRoundrect(CGContextRef context,CGRect rect,CGFloat radius) {
    CGPoint origin = rect.origin;
    CGSize size = rect.size;
    CGContextMoveToPoint(context, origin.x + radius, origin.y);
    //添加上边
    CGContextAddLineToPoint(context, origin.x + size.width - radius, origin.y);
    //添加右上角弧
    CGContextAddArcToPoint(context, origin.x + size.width, origin.y, origin.x + size.width, origin.y + radius, radius);
    //添加右边
    CGContextAddLineToPoint(context, origin.x + size.width, origin.y + size.height - radius);
    //添加右下角弧
    CGContextAddArcToPoint(context, origin.x + size.width, origin.y + size.height, origin.x + size.width - radius, origin.y + size.height, radius);
    //添加底边
    CGContextAddLineToPoint(context, origin.x + radius, origin.y + size.height);
    //添加左下角弧
    CGContextAddArcToPoint(context, origin.x, origin.y + size.height, origin.x, origin.y + size.height - radius, radius);
    //添加左边
    CGContextAddLineToPoint(context, origin.x, origin.y + radius);
    //添加左上角弧
    CGContextAddArcToPoint(context, origin.x, origin.y, origin.x + radius, origin.y, radius);

}

- (void)drawRect:(CGRect)rect
{
    //获取图像上下文对象
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(context, 1,1,1, 0.7);
    CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);
    CGContextSetLineWidth(context, 2);

    drawRoundrect(context,CGRectMake(20, 20, 200, 150), 20);
    CGContextDrawPath(context, kCGPathStroke);

}

运行结果

//绘制多角形
//centerPoint代表中心点,size代表边的长度,count代表角的个数
void drawMulAngle(CGContextRef context,CGPoint centerPoint,CGFloat size,int count) {
    CGFloat dig = 4 * M_PI / count;

    CGContextMoveToPoint(context, centerPoint.x, centerPoint.y + size);
    for (int i = 1; i <= count; i++) {
        CGFloat x = sin(i*dig) * size + centerPoint.x;
        CGFloat y = cos(i*dig) * size + centerPoint.y;

        CGContextAddLineToPoint(context, x, y);
    }
}
- (void)drawRect:(CGRect)rect
{
    //获取图像上下文对象
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(context, 1,1,1, 0.7);
    CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);
    CGContextSetLineWidth(context, 2);

    CGContextBeginPath(context);
    drawMulAngle(context,CGPointMake(160, 200), 50,5);
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathFillStroke);
}

运行结果

时间: 2024-10-14 10:08:52

IOS图像处理(3)绘制路径的相关文章

iOS图像处理之绘制直线

-(void)drawLine:(CGPoint)fromPnt toPoint:(CGPoint)toPnt{ float xScale = theImageView.image.size.width/theImageView.frame.size.width; float yScale = theImageView.image.size.height/theImageView.frame.size.height; UIGraphicsBeginImageContext(theImageVie

iOS 使用贝塞尔曲线绘制路径

使用贝塞尔曲线绘制路径 大多数时候,我们在开发中使用的控件的边框是矩形,或者做一点圆角,是使得矩形的角看起来更加的圆滑. 但是如果我们想要一个不规则的图形怎么办?有人说,叫UI妹子做,不仅省事,还可以趁机接近她们(_:D).这又时候确实可以.但是如果是一个时刻变动的不规则图形,这样如果做成动图或者剪出很多张图,再叫UI妹子做的话,似乎也能解决, 但是实际效果吧,呵呵. 更重要的是从此以后UI妹子不仅不愿搭理你,连以后接触的机会都不会再给你了.好吧,iOS中我们其实不需要担心这个问题.使用UIBe

详解OS X和iOS图像处理框架Core Image

转自:http://www.csdn.net/article/2015-02-13/2823961-core-image 摘要:本 文结合实例详解了OS X和iOS图像处理框架Core Image的使用,如何通过Core Image来创建和使用iOS的内置滤镜,非常适合初学者学习.虽然示例代码是用Swift写的iOS程序,不过实现概念很容易转换到 Objective-C和OS X. 这篇文章会为初学者介绍一下Core Image,一个OS X和iOS的图像处理框架. 如果你想跟着本文中的代码学习

ios 画图,绘制坐标系,画坐标系

先来看个效果: 新建视图类,在直接添加代码: // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // 获取当前环境 CGContextRef context = UIGraphicsGetCurrentContext()

Working with MapKit 使用自定义 MKAnnotation 为地图坐标标记 绘制路径

请允许我模仿各路coding大神的习惯写法,使用“Working with MapKit”这样的装逼语句来说明本文要阐述的内容.没错,本文就是要将我之前学习使用MapKit Framework的过程.心得做一个总结.利用一个简单的栗子demo,来展现如何使用MapKit进行:1,标记若干个坐标,自定义MKAnnotation,显示附加信息:2,画出坐标点之间的线路图. 先来看一下效果: demo我已经放在了这里:https://github.com/pigpigdaddy/MapDemo 使用M

iOS 图像处理-剪裁图像

解决问题:按照某一长宽比例,剪裁图片的上部和下部,保留中间的内容.当然也可以自定义需要剪裁留下的区域 前提:需要添加Framework:CoreGraphics.framework 代码: - (UIImage*) crop:(UIImage*)theImage{ // Get size of current image CGSize size = [theImage size]; // Create rectangle that represents a cropped image CGFlo

iOS 图像处理 - 图像拼接

解决问题:将两个图像拼接在一起 前提:需要添加Framework:CoreGraphics.framework 源码: - (UIImage *) combine:(UIImage*)leftImage :(UIImage*)rightImage { CGFloat width = leftImage.size.width * 2; CGFloat height = leftImage.size.height; CGSize offScreenSize = CGSizeMake(width, h

iOS 图像处理 - 模糊图像

解决问题:将图像模糊 前提:添加 CoreGraphics.framework 源码: - (UIImage*) blur:(UIImage*)theImage { // create our blurred image CIContext *context = [CIContext contextWithOptions:nil]; CIImage *inputImage = [CIImage imageWithCGImage:theImage.CGImage]; // setting up G

iOS界面的绘制和渲染

界面的绘制和渲染 UIView是如何到显示的屏幕上的. 这件事要从RunLoop开始,RunLoop是一个60fps的回调,也就是说每16.7ms绘制一次屏幕,也就是我们需要在这个时间内完成view的缓冲区创建,view内容的绘制这些是CPU的工作:然后把缓冲区交给GPU渲染,这里包括了多个View的拼接(Compositing),纹理的渲染(Texture)等等,最后Display到屏幕上.但是如果你在16.7ms内做的事情太多,导致CPU,GPU无法在指定时间内完成指定的工作,那么就会出现卡

多媒体编程——ios视频图像绘制工具类。

IOS上视频级的图像绘制 ios上的图像绘制常规的是 UIView的drawRect函数,但是这个函数是异步触发,并且由主线程执行.虽然可以通过一定技巧达到主动绘制的效果: 1.传递图像给UIView缓存着. 2.然后调用UIView的setNeedDisplay 改写重绘标志. (以上两步是讲图像丢给UIView,让它自己进行绘制,但是绘制的时机不可控,有时候我们需要它马上绘制,甚至有时候我们需要知道它什么时候绘制完成了,就需要下面两步) 3.在播放线程中调用UIView的 perfromOn