位图上下文
- 怎么让方形图片变成圆形图片?
- 位图上下文
- 生成了一张新的图片
- 应用:水印、圆形图片裁剪
- 手动开启上下文,指定上下文的大小
- 创建时上下文的大小,决定着生成图片的大小
水印
位图上下文的大小 = 图片的大小
加水印:生成一张新的图片
注意:生成图片不是在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:边框宽度
- 宽度高度 = 图片的宽高
- UIBezierPath
-
把路径设置为裁剪区域
- 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
- UIGraphicsBeginImageContextWithOptions(上下文大小,是否为不透明度opaque NO,scale缩放比例
截图
- 遮盖
- 截图
- 蒙版遮盖
- 开始拖动的点
- 当前手指的点
- 宽高--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手指松开
- 移除遮盖
- state:Begin
- 把超过遮盖以外的内容裁减掉
- 生成一张和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