位图上下文

位图上下文

  • 怎么让方形图片变成圆形图片?
  • 位图上下文
    • 生成了一张新的图片
    • 应用:水印、圆形图片裁剪
    • 手动开启上下文,指定上下文的大小
    • 创建时上下文的大小,决定着生成图片的大小

水印

  • 位图上下文的大小 = 图片的大小

  • 加水印:生成一张新的图片

  • 注意:生成图片不是在view上画东西了,不用自定义view,不用写drawRect方法;生成图片可以在任何地方生成。

  • 生成一张新的图片

  • 加载图片

  • 要绘制的文字

  • 开启位图上下文

    • 开启上下文UIGraphicsBeginImageContext
    • 创建时上下文的大小决定着生成图片的大小
  • 把图片会知道上下文当中

    • drawAtPoint/drawInRect
  • 画文字

    • drawAtPoint:withAttribute:
  • 从上下文当中生成一张新的图片

    • UIGraphicsGetImageFromCurrentImageContext()
    • 把上下文当中所有绘制的内容合成到一起,生成一张新的图片
  • 手动关闭上下文

    • UIGraphicsEndImageContext()
  • 拖线,赋值

    • self.imageV.image = newImage;

头像(生成圆形图片)

  • 加载图片
  • 开启位图上下文
    • UIGraphicsBeginImageContext
    • 位图上下文大小 = 图片大小
  • 裁剪(绘制之前做裁剪)
    • UIBezierPath OvalInRect
    • UIRectClip
  • 把路径设置为裁剪区域(超出裁剪区域以外的内容会自动裁剪掉)
    • [path addClip]
    • 对之前已经画上去的东西,没有作用
  • 把图片绘制到上下文当中
    • drawAtPoint
  • 从位图上下文当中生成一张图片
    • UIGraphicsGetImageFromCurrentImageContext()
  • 关闭位图上下文
    • UIGraphicsEndImageContext()
  • 拖线,展示
    • self.imageV.image = newImage;

带有边框的圆形图片裁剪(抽一个分类方便复用)

  • 加载图片

  • 设置边框宽度

  • 开启位图上下文

    • 大小 = 图片的宽高 + 2倍图片边框的宽高
    • UIGraphicsBeginImageContext()
  • 绘制一个大圆

    • UIBezierPath OvalInRect
  • 把大圆画上去 path fill

  • 设置裁剪区域

    • UIBezierPath
      • x,y:边框宽度
      • 宽度高度 = 图片的宽高
  • 把路径设置为裁剪区域

    • addClip
  • 把图片绘制到上下文

  • 从位图上下文当中生成一张图片

    • UIGraphicsGetImageFromCurrentImageContext()
  • 关闭上下文

    • UIGraphicsEndImageContext()
  • 拖线,展示

    • self.imageV.image = newImage;
  • 抽一个分类,方便复用

    • 图片,边框大小,大圆的颜色是变化的
    • ObjectC-file
    • UIImage()
    • 把出现中文的,放到后面

截屏(新的知识点:二进制流)

  • 生成一张新的图片
  • 创建一个位图上下文
    • 大小等于屏幕大小
  • 获取当前上下文
    • CGContextRef UIGraphicsGetCurrentContext
  • 把控制器的view内容画到上下文当中
    • view之所以能显示是因为内部有layer
    • self.view.layer renderInContext:
  • 从上下文当中生成一张新的图片
    • Get
  • 关闭上下文
    • End
  • 把手机生成的图片,生成到电脑的桌面上
    • 怎么把图片上传到服务器的?
    • 把图片转成二进制流
    • 如何把图片转成二进制流?
      • UIImage
      • 转成jpe还是png
      • UIImageJPERepresentation(newImage,压缩质量:范围0~1)
      • 返回值NSData
      • data writeToFile:atomically:
      • UIImagePNGRepresentation(本身就是最高质量的图片)

截屏扩展

  • [UIScreen mainScreen].scale 不是固定的值,根据手机型号的不同值不同
    • 点坐标*比例 ——> 转成像素坐标
    • 在OC当中会自动把点坐标转成像素
    • 在C语言当中,它不会自动转成像素
  • 开启上下文
    • UIGraphicsBeginImageContextWithOptions(上下文大小,是否为不透明度opaque NO,scale缩放比例点坐标与像素的比例)
    • scale 1.0
    • scale 2.0 打印的size 和生成图片的size尺寸不一样
    • scale 0.0 设备的[UIScreen mainScreen].scale
    • scale 缩放因子 bitmap

截图

  • 遮盖
  • 截图
  • 蒙版遮盖
    • 开始拖动的点
    • 当前手指的点
    • 宽高--x,y的偏移量
  • 添加手势Pan Gesture Recognizer
  • 监听拖动时会调用哪个方法,拖线,判断手势状态
    • state:Begin
      • 获取手指当前点:locationInView
      • 定义一个成员属性,方便下面拿到当前点
    • state:Change
      • locationInView
      • 宽度:x方向偏移量
      • 高度:y方向的偏移量
      • frame
        • startP.X
        • startP.y
        • w
        • h
    • 创建遮盖的view
      • 懒加载
      • 懒加载的好处:
        • 1.什么时候使用什么时候才去创建,节省内存
        • 2.保证对象只有一个
        • 3.保证该对象在使用时一直存在
    • state:End手指松开
      • 移除遮盖
  • 把超过遮盖以外的内容裁减掉
    • 生成一张和imageView一样大的图片
    • 开启上下文UIGraphicsBeginImageContext:默认是透明的
    • 裁剪:UIRectClip(遮盖的frame)
    • CGContextRef
    • renderInContext
    • 生成图片
    • 关闭上下文
    • self.imageV.image = newImage

扩展

  • 手指松开,生成图片不是imageView大小
  • 把生成遮盖大小的图片,显示到桌面上面
  • 画图片,开启上下文,遮盖大小
  • 拿到图片,往上面画

图片擦除(橡皮擦功能)

  • uerInteraction
  • 添加手势
    • Pan
  • 擦除区域
    • 获取当前手指的点locationInView
    • rectWH = 30
    • X:当前点x- 宽度的一半
    • Y:当前点y- 高度一半
  • 开启上下文Begin
  • 把图片内容画到画板上renderInContext
  • 擦除
    • CGContextClearRect(context,rect)
  • 生成一张图片Get
  • 关闭上下文End
  • 替换imageView

你可能感兴趣的:(位图上下文)