美文网首页
iOS 14:Quartz2D 的深入应用:图片操作、画板

iOS 14:Quartz2D 的深入应用:图片操作、画板

作者: d2cd99b0efce | 来源:发表于2016-04-06 22:08 被阅读211次

项目:图片水印

  • 获取上下文,之前的上下文都是在view的drawRect 方法中获取(跟view的layer相关联的上下文)
  • 怎么获取位图上下文,注意位图上下文的获取方式跟layer上下文不一样,需要我们手动创建。
  • 步骤:
    • 1.开启一个位图上下文
    • 2.绘制原生的图片
    • 3.给原生的图片添加文字
    • 4.生成一张图片给我们,从上下文中获取图片
    • 5.关闭上下文
    // 开启一个位图上下文,注意位图上下文跟view无关联,所以不需要在drawRect.
    // size:位图上下文的尺寸(新图片的尺寸)
    // opaque: 不透明度 YES:不透明 NO:透明,通常我们一般都弄透明的上下文
    // scale:通常不需要缩放上下文,取值为0,表示不缩放
    UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);

图片裁剪

把正方性图片重新生产一张圆形的图片
  • 初始的画板上面没有任何东西,是创建一个又一个路径并往上面添加
  • 步骤:
    • 1.加载图片
    • 2.开启位图上下文,跟图片尺寸一样大
    • 3.设置原型裁剪区域,正切于图片。创建原型的路径,并把路径设置为裁剪区域。
    • 4.绘制图片
    • 5.从上下文中获取图片
    • 6.关闭上下文
  • 注意:在裁剪区域之前设置圆环。
  • 使用分类,抽取代码方法:返回裁剪的图片。可为UIImage 类增加额外的方法,将代码封装起来,复用。

屏幕截图

用于分享图片内容,炫耀装B
  • 步骤
    • 1.开启位图上下文
    • 2.获取上下文
    • 3.将控件上的图层渲染到上下文,layer只能渲染,不能绘制。但是字符串以及图片均可以绘制。
    • 4.生成一张图片
    • 5.关闭上下文
  • 将图片保存到本地文件,并没有直接的对象方法可以调用,需要将其转化为NSData,再写入文件,代码如下
    // image转data
    // compressionQuality: 图片质量 1:最高质量
    // PNG的图片质量较为清晰,JPEG次之。
    NSData *data = UIImageJPEGRepresentation(image,1);
    [data writeToFile:@"/Users/xiaomage/Desktop/view.png" atomically:YES];
  • 抽取代码:返回屏幕截图后的图片,为UIImage 类增加额外的功能。

图片截取、图片擦除

  • 图片截取步骤:
    • 给控制器的view 添加一个 pan 手势
    • pan 行为发生的时候进入处理函数
    • 一开始拖动的时候
      • 获取一开始触摸点
    • 一直拖动的时候
      • 获取结束点
      • 获取截取范围
      • 生成截屏的view,并将其添加至view中
    • 拖动结束的时候
      • 开启上下文
      • 设置裁剪区域
      • 获取上下文
      • 把控件上的内容渲染到上下文
      • 生成一张新的图片
      • 关闭上下文
      • 移除截屏的view
  • 图片擦除代码如下:
- (void)pan:(UIPanGestureRecognizer *)pan
{
    // 获取当前点
    CGPoint curP = [pan locationInView:self.view];
    // 获取擦除的矩形范围
    CGFloat wh = 100;
    CGFloat x = curP.x - wh * 0.5;
    CGFloat y = curP.y - wh * 0.5;
    CGRect rect = CGRectMake(x, y, wh, wh);
   // 开启上下文
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 控件的layer渲染上去
    [_imageView.layer renderInContext:ctx];
    // 擦除图片
    CGContextClearRect(ctx, rect);
    // 生成一张图片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    _imageView.image = image;
    
    // 关闭上下文
    UIGraphicsEndImageContext(); 
}

手势解锁

  • 按钮的选中状态与高亮状态是不一样的。分别为:UIControlStateSelected\UIControlStateHighlighted。高亮状态是按钮点击时候发生的,选择状态可以代码设置。
  • 为什么要在- (void)layoutSubviews布局子控件,因为只要一调用这个方法,就表示父控件的尺寸确定。
  • 从storyboard上也可以创建手势,总共有7个。

项目:画板

  • 搭建界面
    • 使用toolBar 控件,添加UIBarButtonItem 模型。可以方便的对其内容进行布局管理。
    • 使用Flexible Bar Button Item 放在 UIBarButtonItem 之前,在toolBar控件frame改变的时候,起到一个弹簧的作用。
  • 在 awakeFromNib:以及initWithFrame:都要进行初始化设置,具有更好的扩展性。
  • 在使用drawRect:方法重新绘制屏幕时,可以将贝瑟尔路径定义在外面,然后在drawRect:中执行:[path stroke]方法也可。
  • 只要调用drawRect:方法,就会把之前的内容全部清空
  • UIImagePickerController 系统相册控制器
    • 通过设置控制器的来源:可以有相册集\照片库\相机
    • 监听用户在系统相册控制器的行为,需要设置delegate
  • 使用位图上下文来进行画图截屏
  • UIImageWriteToSavedPhotosAlbum:方法,可以将图片写入至相册,并可以监听到是否保存完成,保存完成的方法不能够随便乱写,具体见官方说明。

相关文章

网友评论

      本文标题:iOS 14:Quartz2D 的深入应用:图片操作、画板

      本文链接:https://www.haomeiwen.com/subject/wnemlttx.html