Canvas(三-关于绘图的一些技巧2)

本文介绍了Qt Quick中的Canvas如何进行坐标变换,包括移动画布原点和旋转,以及使用组合模式和像素缓冲进行图像操作。示例代码展示了如何读取和设置像素数据,以及将画布内容转换为图片数据。同时,文章提到了一个错误:`getImageData`未定义,可能是因为缺少正确的上下文或导入。
摘要由CSDN通过智能技术生成

坐标变换:

就是改变画布的原点坐标了

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true
    width: 240
    height: 120
    title: qsTr("Hello World")

    Item {
        anchors.fill: parent
        Canvas{
            id:root
            anchors.fill: parent

            onPaint: {
                var ctx = getContext("2d")
                ctx.strokeStyle = "blue"
                ctx.lineWidth = 4

                ctx.beginPath()
                ctx.rect(-20,-20,40,40)
                // 移动画布原点到 120.60
                ctx.translate(120,60)
                ctx.stroke()

                ctx.rect(-20,-20,40,40)
                // 画布原点旋转 45 度
                ctx.rotate(Math.PI / 4)
                ctx.stroke()
            }
        }
    }
}

组合模式:

组合允许你绘制一个形状然后与已有的像素点集合混合
Canvas提供了多种组合模式,使用globalCompositeOperation(mode)来设置

(这里就不掩饰了)

像素缓冲:

  • 当你使用画布时,你可以检索读取画布上的像素数据,或者操作画布上的像素。
  • 读取图像数据使用createImageData(sw,sh)或者getImageData(sx,sy,sw,sh)。
  • 这两个函数都会返回一个包含宽度(width),高度(height)和数据(data)的图像数据 (ImageData)对象
  • 图像数据包含了一维数组像素数据,使用RGBA格式进行检索。每个数据的数据范围在0到255之间。
  • 设置画布的像素数据可以使用 putImageData(imagedata,dx,dy)函数来完成。
  • 另一种检索画布内容的方法是将画布的数据存储进一张图片中。
  • 可以使用画布的函 数save(path)或者toDataURL(mimeType)来完成
  • toDataURL(mimeType)会返回一个图片的地址,这个链接可以直接用Image元素来读取。
import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true
    width: 240
    height: 120
    title: qsTr("Hello World")

    Item {
        anchors.fill: parent
        Canvas{
            id:canvas
            x:10
            y:10
            width: 100
            height:100
            property real hue: 0.0
            onPaint: {
                var ctx = getContext("2d")
                var x = 10 + Math.random(80)*80
                var y = 10 + Math.random(80)*80
                hue += Math.random()*0.1
                if(hue > 1.0) { hue -= 1 }
                ctx.globalAlpha = 0.7
                ctx.fillStyle = Qt.hsla(hue, 0.5, 0.5, 1.0)
                ctx.beginPath()
                ctx.moveTo(x+5,y)
                ctx.arc(x,y, x/10, 0, 360)
                ctx.closePath()
                ctx.fill()
            }
            MouseArea{
                anchors.fill: parent
                onClicked: {
                    // 将画布存进一张图片
                    var url = canvas.toDataURL('image/png')
                    print('image url=', url)
                    image.source = url
                }
            }

            Image {
                id: image
                x: 130;
                y: 10
                width: 100;
                height: 100
            }

            Timer{
                interval: 1000
                running: true
                triggeredOnStart: true
                repeat: true
                onTriggered: canvas.requestPaint()
            }
        }
    }
}

上面的例子演示了 toDataURL 的用法!

接下来再演示一下另一种保存像素的用法:

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true
    width: 400
    height: 300
    title: qsTr("Hello World")

    Item {
        anchors.fill: parent
        Canvas{
            anchors.fill: parent

            onPaint: {
                var ctx = getContext("2d")
                ctx.fillStyle = "yellow"
                ctx.fillRect(0,0,parent.width,parent.height)

                // 定义阴影效果
                ctx.shadowColor = "blue"
                ctx.shadowOffsetX = 2
                ctx.shadowOffsetY = 2
                // 模糊程度
                ctx.shadowBlur = 10

                // 绘制矩形
                ctx.fillStyle = "white"
                ctx.fillRect(10,10,60,60)
                
                // 操作像素
                // 返回 imageData 对象
                var img = getImageData(0,0,100,100)
                putImageData(img,120,0)
            }
        }
    }
}

很奇怪,显示错误:ReferenceError: getImageData is not defined!

是不是因为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sssnial-jz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值