iOS开发UI篇—Quartz2D使用(图形上下文栈)

部署运行你感兴趣的模型镜像

Quartz2D?                                                                                                                                

Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统

Quartz 2D能完成的工作

  • 绘制图形 : 线条/三角形/矩形/圆/弧等
  • 绘制文字
  • 绘制/生成图片(图像)
  • 读取/生成PDF
  • 截图/裁剪图片
  • 自定义UI控件
  • ……….

2. Quartz 2D应用示例                                                                                                                               

裁剪图片

360截图20140417211614966

涂鸦/画板

wps_clip_image-22172

手势解锁

wps_clip_image-21802

报表

wps_clip_image-1091wps_clip_image-25115

屏幕截图

wps_clip_image-1240

3. 图形上下文(Graphics Context)                                                                                                            

因为很多计算机的概念和术语,都是从外文翻译而来。所以有些的术语比较难以理解,看其名,不知其意。

图形上下文(Graphics Context)中的‘Context’还可以翻译为‘环境’(setting)。

图形上下文是一种特殊类型(CGContextRef)的数据,它保存了绘图信息,绘图状态以及图形的输出目标。

开发中,你绘制的图形信息(矩形,线段,圆。。。),设置的图形状态(颜色,线宽。。。)等信息首先是以数据的形式保存在图形上下文类型的变量中,然后再根据图形上下文中的输出目标绘制到不同的显示介质上。

360截图20140417212004368

相同的一套绘图序列,只要指定不同的图形上下文(这里指输出目标不同的图形上下文),就可将相同的图像绘制到不同的目标上

Quartz2D提供了以下几种类型的Graphics Context:

  • Bitmap Graphics Context
  • PDF Graphics Context
  • Window Graphics Context
  • Layer Graphics Context
  • Printer Graphics Context

wps_clip_image-12484

4. 自定义View(自定义UI控件)                                                                                                                  

4.1  iOS提供的UIKi t框架已经包含了很多各种各样的控件

  • UILabel:显示文字
  • UIImageView:显示图片
  • UIButton:同时显示图片和文字(能点击)
  • … …

利用UIKit框架,我们可以搭建和实现一些简单的,常见的UI界面。但是,有些UI界面极其复杂,而且比较个性化,用普通的UI控件无法实现,这时可以利用Quartz2D技术将控件内部的结构画出来,自定义控件的样子。

事实上,iOS中大部分控件的内容也是通过Quartz 2D绘画出来的。

4.2  若想利用Quartz 2D在View上绘制信息,首先必须有图形上下文,用来保存绘图信息,输出目标。其次,图像上下文与View相关联(这时候图形上下文的输出目标即为关联的View)。

详细步骤:

1) 新建一个类,继承自UIView

2) 实现- (void)drawRect:(CGRect)rect方法,然后在这个方法中

3) 取得跟当前view相关联的图形上下文(注意这里之所以没有新建一个图形上下文,是因为系统已经自动创建了一个Layer图形上下文,并且与当前的View相关联)

4) 绘制相应的图形内容

5) 利用图形上下文将绘制的所有内容渲染显示到view上面

4.3  drawRect:

• 为什么要实现drawRect:方法才能绘图到view上?

Ø 因为在drawRect:方法中才能取得跟view相关联的图形上下文

• drawRect:方法在什么时候被调用?

Ø 当view第一次显示到屏幕上时(被加到UIWindow上显示出来)

Ø 调用view的setNeedsDisplay或者setNeedsDisplayInRect:时

5.绘图顺序                                                                                                                                              

后绘制的图形若与先绘制的图形发生重叠,后绘制的图形覆盖先绘制的图形。

wps_clip_image-14558

5. 注意事项                                                                                                                                               

1 Quartz2D的API是纯C语言的

2 Quartz2D的API来自于Core Graphics框架

wps_clip_image-8291

3 数据类型和函数基本都以CG作为前缀

  • 1) CGContextRef
  • 2) CGPathRef
  • 3) CGContextStrokePath(ctx);
  • 4) ……

6. Quartz2D绘图的代码步骤                                                                                                                       

  • 1. 获得图形上下文
  • CGContextRef ctx = UIGraphicsGetCurrentContext();
  • 2. 拼接路径(下面代码是搞一条线段)
  • CGContextMoveToPoint(ctx, 10, 10);
  • CGContextAddLineToPoint(ctx, 100, 100);
  • 3. 绘制路径
  • CGContextStrokePath(ctx); // CGContextFillPath(ctx);

7. 常用拼接路径函数                                                                                                                                   

  • 新建一个起点
  • void CGContextMoveToPoint(CGContextRef c, CGFloat x, CGFloat y)
  • 添加新的线段到某个点
  • void CGContextAddLineToPoint(CGContextRef c, CGFloat x, CGFloat y)
  • 添加一个矩形
  • void CGContextAddRect(CGContextRef c, CGRect rect)
  • 添加一个椭圆
  • void CGContextAddEllipseInRect(CGContextRef context, CGRect rect)
  • 添加一个圆弧
  • void CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y,
  •   CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)

8. 常用绘制路径函数                                                                                                                                   

  • Mode参数决定绘制的模式
  • void CGContextDrawPath(CGContextRef c, CGPathDrawingMode mode)
  • 绘制空心路径
  • void CGContextStrokePath(CGContextRef c)
  • 绘制实心路径
  • void CGContextFillPath(CGContextRef c)
  • 提示:一般以CGContextDraw、CGContextStroke、CGContextFill开头的函数,都是用来绘制路径的

9. 图形上下文栈的操作                                                                                                                                   

  • 将当前的上下文copy一份,保存到栈顶(图形上下文栈)
  • void CGContextSaveGState(CGContextRef c)
  • 将栈顶的上下文出栈,替换掉当前的上下文
  • void CGContextRestoreGState(CGContextRef c)

10. 矩阵操作                                                                                                                                               

利用矩阵操作,能让绘制到上下文中的所有路径一起发生变化

  • 缩放
  • void CGContextScaleCTM(CGContextRef c, CGFloat sx, CGFloat sy)
  • 旋转
  • void CGContextRotateCTM(CGContextRef c, CGFloat angle)
  • 平移
  • void CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty)

11. Quartz2D的内存管理                                                                                                                               

  • 使用含有“Create”或“Copy”的函数创建的对象,使用完后必须释放,否则将导致内存泄露
  • 使用不含有“Create”或“Copy”的函数获取的对象,则不需要释放
  • 如果retain了一个对象,不再使用时,需要将其release掉
  • 可以使用Quartz 2D的函数来指定retain和release一个对象。例如,如果创建了一个CGColorSpace对象,则使用函数CGColorSpaceRetain和CGColorSpaceRelease来retain和release对象。
  • 也可以使用Core Foundation的CFRetain和CFRelease。注意不能传递NULL值给这些函数

您可能感兴趣的与本文相关的镜像

Qwen-Image

Qwen-Image

图片生成
Qwen

Qwen-Image是阿里云通义千问团队于2025年8月发布的亿参数图像生成基础模型,其最大亮点是强大的复杂文本渲染和精确图像编辑能力,能够生成包含多行、段落级中英文文本的高保真图像

本文旨在系统阐述利用MATLAB平台执行多模态语音分离任务的方法,重点围绕LRS3数据集的数据生成流程展开。LRS3(长时RGB+音频语音数据集)作为一个规模庞大的视频与音频集合,整合了丰富的视觉与听觉信息,适用于语音识别、语音分离及情感分析等多种研究场景。MATLAB凭借其高效的数值计算能力与完备的编程环境,成为处理此类多模态任务的适宜工具。 多模态语音分离的核心在于综合利用视觉与听觉等多种输入信息来解析语音信号。具体而言,该任务的目标是从混合音频中分离出同说话人的声音,并借助视频中的唇部运动信息作为辅助线索。LRS3数据集包含大量同步的视频与音频片段,提供RGB视频、单声道音频及对应的文本转录,为多模态语音处理算法的开发与评估提供了重要平台。其高质量与大容量使其成为该领域的关键资源。 在相关资源包中,主要包含以下两部分内容: 1. 说明文档:该文件详细阐述了项目的整体结构、代码运行方式、预期结果以及可能遇到的问题与解决方案。在进行数据处理或模型训练前,仔细阅读此文档对正确理解与操作代码至关重要。 2. 专用于语音分离任务的LRS3数据集版本:解压后可获得原始的视频、音频及转录文件,这些数据将由MATLAB脚本读取并用于生成后续训练与测试所需的数据。 基于MATLAB的多模态语音分离通常遵循以下步骤: 1. 数据预处理:从LRS3数据集中提取每段视频的音频特征与视觉特征。音频特征可包括梅尔频率倒谱系数、感知线性预测系数等;视觉特征则涉及唇部运动的检测与关键点定位。 2. 特征融合:将提取的音频特征与视觉特征相结合,构建多模态表示。融合方式可采用简单拼接、加权融合或基于深度学习模型的复杂方法。 3. 模型构建:设计并实现用于语音分离的模型。传统方法可采用自适应滤波器或矩阵分解,而深度学习方法如U-Net、Transformer等在多模态学习中表现优异。 4. 训练与优化:使用预处理后的数据对模型进行训练,并通过交叉验证与超参数调整来优化模型性能。 5. 评估与应用:采用信号失真比、信号干扰比及信号伪影比等标准指标评估模型性能。若结果满足要求,该模型可进一步应用于实际语音分离任务。 借助MATLAB强大的矩阵运算功能与信号处理工具箱,上述步骤得以有效实施。需注意的是,多模态任务常需大量计算资源,处理大规模数据集时可能需要对代码进行优化或借助GPU加速。所提供的MATLAB脚本为多模态语音分离研究奠定了基础,通过深入理解与运用这些脚本,研究者可更扎实地掌握语音分离的原理,从而提升其在实用场景中的性能表现。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值