# 功能效果
# 功能分析
功能:渲染一张传入的图片 -> 手动选择编辑区域 -> 通过滑块来编辑区域的增高或者缩短
OpenGL 原理:
因为 OpenGL 只能绘制三角形,所以在处理图像或者图形的时候我们需要将被处理的对象用三角行来分割转换为三角形和顶点的组成的对象。
OpenGL 里面坐标是以左下角为原点 X 轴向上为正,Y 轴向右为正
# 功能实现
- 渲染图片拆分图片:
- 拆分方法 1:通过图形看出是一个矩形,而矩形是可以分成两个三角形和四个顶点,通过此可以用 GL 渲染出图片。
这样拆分之后虽然可以正常渲染,但是带来的问题是我的四个顶点都是死的,也就是四个顶点必须是画布的四个顶点,改变顶点的坐标后只能导致整张画布的变动,而不是某一个区域的变动,拉伸的话也是整张图片的拉伸,所以想要实现局部处理的话这种分割方式不可行。
- 拆分方法 2:将整张图片先拆分为三个矩形,然后再把每个矩形拆分成两个三角形,得到 6 个三角形,8 个顶点,如下图:
这样一来就可以保证中间的矩形的高度可以任意变化而上下两部分的高度不变只改变位置,也就是说我们这个 DEMO 中所做的任何拉伸操作都是对中间矩形的操作,换而言之就是改变最上面的矩形和最下面的矩形之间的距离来达到对中间区域的拉伸和压缩的目的。根据拆分的方式我们用顶点的坐标创建一个数组
1 | //顶点数组 |
- 手动选择区域:通过添加带有自定义手势的 UIView 来实现拖动修改选择区域。
1 | *****************CustomPanView代码****************** |
1 | *****************CustomPanViewDelegate代码****************** |
使用一个 Delegate 将拖移后的 Y 坐标返回,因为是竖直运动的所以我们只关心 Y 轴坐标。
- 改变大小:通过将 UISliderBar 的 ValueChange 和顶点坐标关联来实现改变顶点坐标,之后调用 GLKView 的 display 的方法来刷新 UI,将变化的过程展现出来。
1 | - (void)action:(UISlider *)sender { |
- 通过 glReadPixels 来从内存中读取像素数据,GLubyte -> CGImageRef -> UIimage 然后最相关的保存或者其他操作。
1 | #pragma mark - |