Qt 学习之路 2(89):Canvas(续)
来源:互联网 发布:随心安软件 编辑:程序博客网 时间:2024/06/16 20:43
变换
Canvas
中的“变形”,主要指的是坐标系的变换,而不是路径的变换。这与 QML 元素变换非常相似,都可以实现坐标系统的scale
(缩放)、rotate
(旋转)和translate
(平移);不同的是,变换的原点是画布原点。例如,如果以一个路径的中心点为定点进行缩放,那么,你需要现将画布原点移动到路径中心点。我们也可以使用变换函数实现复杂的变换。理解“变换是针对坐标系的”这一点非常重要,有时候可以避免很多意外的结果。
运行结果如下:
通过调用resetTransform()
函数,可以将变换矩阵重置为单位矩阵:
组合
组合意思是,将你绘制的图形与已存在的像素做一些融合操作。canvas支持几种组合方式,使用
globalCompositeOperation
可以设置组合的模式。如下代码所示,我们可以看到组合的相应表现:
代码运行结果如下:
像素缓存
使用canvas
,你可以将canvas
内容的像素数据读取出来,并且能够针对这些数据做一些操作。
使用createImageData(sw, sh)
或getImageData(sx, sy, sw, sh)
函数可以读取图像数据。这两个函数都会返回一个ImageData
对象,该对象具有width
、height
和data
等变量。data
包含一个以 RGBA 格式存储的像素一维数组,其每一个分量值的范围都是 [0, 255]。如果要设置画布上面的像素,可以使用putImageData(imagedata, dx, dy)
函数。
另外一个获取画布内容的方法是,将数据保存到一个图片。这可以通过Canvas
的函数save(path)
或toDataURL(mimeType)
实现,后者会返回一个图像的 URL,可以供Image
元素加载图像。
在上面的例子中,我们创建了两个画布,左侧的画布每一秒产生一个圆点;鼠标点击会将画布内容保存,并且生成一个图像的 URL,右侧则会显示这个图像。
Canvas 绘制
下面我们利用Canvas
元素创建一个画板程序。我们程序的运行结果如下所示:
窗口上方是调色板,用于设置画笔颜色。色板是一个填充了颜色的矩形,其中覆盖了一个鼠标区域,用于检测鼠标点击事件。
调色板所支持的颜色保存在一个数组中,画笔的当前颜色则保存在paintColor
属性。当用户点击调色板的一个色块,该色块的颜色就会被赋值给paintColor
属性。
为了监听鼠标事件,我们在画布上面覆盖了一个鼠标区域,利用鼠标按下和位置改变的信号处理函数完成绘制:
鼠标左键按下时,其初始位置保存在lastX
和lastY
两个属性。鼠标位置的改变会请求画布进行重绘,该请求则会调用onPaint()
处理函数。
最后,为了绘制用户笔记,在onPaint()
处理函数中,我们首先创建了一个新的路径,将其移动到最后的位置,然后我们从鼠标区域获得新的位置,在最后的位置与新的位置之间绘制直线,同时,将当前鼠标位置(也就是新的位置)设置为新的最后的位置。
从 HTML5 移植
由于 QML 的Canvas
对象由 HTML 5 的 canvas 标签借鉴而来,将 HTML 5 的 canvas 应用移植到 QML Canvas
也是相当容易。我们以 Mozilla 提供的繁华曲线页面为例,演示移植的过程。可以在这里看到该页面的运行结果。下面是 HTML 5 canvas 的脚本部分:
这里我们只解释如何进行移植,有关繁花曲线的算法则不在我们的阐述范围之内。幸运的是,我们需要改变的代码很少,因而这里也会很短。
HTML 按照顺序执行,draw() 会成为脚本的入口函数。但是在 QML 中,绘制必须在 onPaint 中完成,因此,我们需要将 draw() 函数的调用移至 onPaint。通常我们会在 onPaint 中获取绘制上下文,因此,我们将给 draw() 函数添加一个参数,用于接受Context2D
对象。事实上,这就是我们所有的修改。移植之后的 QML 如下所示:
运行一下这段代码:
- Qt 学习之路 2(89):Canvas(续)
- Qt 学习之路 2(88):Canvas
- Qt 学习之路 2(88):Canvas
- html5 学习之路 二(canvas)
- Qt 学习之路 2(2):Qt 简介 笔记
- Qt 学习之路 2(2):Qt 简介
- Qt 学习之路 2(6):Qt 模块简介
- Qt 学习之路 2(83):Qt Quick Controls
- Qt 学习之路 2(6):Qt 模块简介
- Qt 学习之路 2(83):Qt Quick Controls
- html5学习之路(Canvas画布1)
- canvas学习之路(一)基础绘图功能解析
- canvas学习之路(一)基础绘图功能解析
- HTML5的学习之Canvas(二)
- 学习Qt的QML的Canvas(一) ---(参考书籍 《Qt Quick 核心编程-安晓辉》)
- Canvas 学习之 (2) translate
- QT学习之路(一)——大话QT
- qt学习之路六(QT的tcp传输)
- Qt 学习之路 2(87):模型-视图高级技术
- ./和../的区别
- 利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
- Qt 学习之路 2(88):Canvas
- uva 12716 GCD XOR (数论)枚举技巧(筛法) + 思维
- Qt 学习之路 2(89):Canvas(续)
- openlayers4源码解读系列
- java 创建文件与读写
- leaflet1.2.0源码解读系列
- Qt 学习之路 2(90):粒子系统
- 保研经历-从信工所-国防科大-上交-最后确定复旦(信息安全专业)
- 如何让sublime编译和运行c和c++代码
- 方向比努力更重要
- Pandas绘图