• iOS开发Quzrtz2D 十:圆形图片的绘制以及加边框圆形图片的绘制


    一:圆形图片的绘制

    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIImageView *imageV;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        /**
         * UIBezierPath:绘制路径,就是根据路径对图形上下文进行构造
         */
        //0.加载图片
        UIImage *image = [UIImage imageNamed:@"阿狸头像"];
        //1.开启跟原始图片一样大小的上下文
        UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
        //2.设置一个圆形裁剪区域
        //2.1绘制一个圆形
        UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
        //2.2.把圆形的路径设置成裁剪区域
        [path addClip];//超过裁剪区域以外的内容都给裁剪掉
        //3.把图片绘制到上下文当中(超过裁剪区域以外的内容都给裁剪掉)
        [image drawAtPoint:CGPointZero];
        //4.从上下文当中取出图片
        UIImage *newImage =  UIGraphicsGetImageFromCurrentImageContext();
        //5.关闭上下文
        UIGraphicsEndImageContext();
        
        
        self.imageV.image = newImage;
        
    }
    
    
    
    @end

    裁剪图片思路.

        开启一个图片上下文.

        上下文的大小和原始图片保持一样.以免图片被拉伸缩放.

        在上下文的上面添加一个圆形裁剪区域.圆形裁剪区域的半径大小和图片的宽度一样大.

        把要裁剪的图片绘制到图片上下文当中.

        从上下文当中取出图片.

        关闭上下文.

        

        1.如何设置圆形路径?

         UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:

         CGRectMake(0, 0, image.size.width, image.size.width)];

        

         

        2.如何把一个路径设为裁剪区域?

        [path addClip];

    二:带边框的圆形图片绘制

    #import <UIKit/UIKit.h>
    
    @interface UIImage (image)
    
    /**
     *  生成一张带有边框的圆形图片
     *
     *  @param borderW     边框宽度
     *  @param borderColor 边框颜色
     *  @param image       要添加边框的图片
     *
     *  @return 生成的带有边框的圆形图片
     */
    + (UIImage *)imageWithBorder:(CGFloat)borderW color:(UIColor *)borderColor image:(UIImage *)image;
    
    @end
    #import "UIImage+image.h"
    
    @implementation UIImage (image)
    
    
    + (UIImage *)imageWithBorder:(CGFloat)borderW color:(UIColor *)borderColor image:(UIImage *)image{
        
        //0.加载图片
        //UIImage *image = [UIImage imageNamed:@"阿狸头像"];
        //1.确定边框宽度
        //CGFloat borderW = 5;
        //2.开启一个上下文
        CGSize size = CGSizeMake(image.size.width + 2 * borderW, image.size.height + 2 * borderW);
        UIGraphicsBeginImageContextWithOptions(size, NO, 0);
        //3.绘制大圆,显示出来
        UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, size.width, size.height)];
        [borderColor set];
        [path addClip];
        [path fill];//自动将路径添加到上下文
        //4.绘制一个小圆,把小圆设置成裁剪区域
        UIBezierPath *clipPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(borderW, borderW, image.size.width, image.size.height)];
       [clipPath addClip];//自动将路径添加到上下文,并且超过裁剪区域的路径直接裁减掉,此方法会裁减掉超过大圆的部分
        //5.把图片绘制到上下文当中,drawAtPoint画出的图片大小和image大小相同
        [image drawAtPoint:CGPointMake(borderW, borderW)];
        //6.从上下文当中取出图片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        //7.关闭上下文
        UIGraphicsEndImageContext();
        
        return newImage;
    }
    
    
    
    
    @end

    具体实现思路:

    1.假设边框宽度为BorderW

    2.开启的图片上下文的尺寸就应该是原始图片的宽高分别加上两倍的BorderW,这样开启的目的是为了不让原始图片变形.

    3.在上下文上面添加一个圆形填充路径.位置从0,0点开始,宽高和上下文尺寸一样大.设置颜色为要设置的边框颜色.

    4.继续在上下文上面添加一个圆形路径,这个路径为裁剪路径.

      它的x,y分别从BorderW这个点开始.宽度和高度分别和原始图片的宽高一样大.

      将绘制的这个路径设为裁剪区域.

    5.把原始路径绘制到上下文当中.绘制的位置和是裁剪区域的位置相同,x,y分别从border开始绘制.

    6.从上下文状态当中取出图片.

    7.关闭上下文状态.

  • 相关阅读:
    ECMAScript6——异步操作之Promise
    ECMAScript6——Set数据结构
    浅复制与深复制
    构造HTTP请求Header实现"伪造来源IP"
    Matlab图像直方图相关函数
    蓝蓝设计 使用全屏照片的网页设计欣赏
    JRainbow开发进度
    组合之01转换法
    python 学习笔记 9 -- Python强大的自省简析
    幻世(OurDream)2D图形引擎易语言汉化版更新提示
  • 原文地址:https://www.cnblogs.com/cqb-learner/p/5823963.html
Copyright © 2020-2023  润新知