百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

【QML 画布Canvas】2D绘图(下)

bigegpt 2024-09-18 07:51 5 浏览

接着上一章的内容,本章继续进行后续画图相关操作。

1、渐变填充

Canvas 支持 3 种渐变:线性渐变、辐射渐变、锥形渐变。

1.1、线性渐变

  • createLinearGradient(real x0, real y0, real x1, real y1),返回一个 CanvasGradient 对象,该对象表示线性渐变,该渐变沿起点(x0,y0)和终点(x1,y1)之间的线过渡颜色;
  • addColorStop 函数添加渐变点;

下面看一个示例:

import QtQuick 2.9

Canvas {
    width:120
    height: 120

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

        var linear = ctx.createLinearGradient(10, 10, 100, 10)
        linear.addColorStop(0, "white")
        linear.addColorStop(0.5, "#FF00FF")
        linear.addColorStop(1, "#333333")
        ctx.fillStyle = linear
        ctx.fillRect(10, 10, 100, 100)
        ctx.strokeRect(10, 10, 100, 100)
    }
}

运行结果如下:

1.2、辐射渐变

  • createRadialGradient(real x0, real y0, real r0, real x1, real y1, real r1),返回一个CanvasGradient对象,该对象表示一个辐射渐变,该渐变沿由起始圆(x0,y0)和半径 r0以及终止圆的原点(x1,y1)和半径 r1 给出的圆锥进行绘制。
  • addColorStop 函数添加渐变点;

QT开发交流+赀料君羊:714620761

下面看一个示例:

import QtQuick 2.9

Canvas {
    width:120
    height: 120

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

        var radial = ctx.createRadialGradient(30, 70, 5, 60, 50, 80)
        radial.addColorStop(0, "white")
        radial.addColorStop(0.5, "#FF00FF")
        radial.addColorStop(1, "#333333")
        ctx.fillStyle = radial
        ctx.fillRect(10, 10, 100, 100)
        ctx.strokeRect(10, 10, 100, 100)
    }
}

1.3、锥形渐变

  • createConicalGradient(real x, real y, real angle),返回一个 CanvasGradient 对象,该对象表示一个圆锥形渐变,该圆锥形渐变围绕中心点(x,y)沿逆时针方向插入颜色,起始角度以弧度为单位。
  • addColorStop 函数添加渐变点;

下面看一个示例:

import QtQuick 2.12

Canvas {
    width:120
    height: 120

    onPaint: {
        var ctx = getContext("2d")
        var conical = ctx.createConicalGradient(60, 60, Math.PI / 4)
        conical.addColorStop(0, "white")
        conical.addColorStop(0.5, "#FF00FF")
        conical.addColorStop(1, "#333333")
        ctx.fillStyle = conicals
        ctx.fillRect(10, 10, 100, 100)
        ctx.strokeRect(10, 10, 100, 100)
    }
}

运行效果如下:

2、阴影

  • shadowOffsetX:阴影在 x 轴方向偏移。
  • shadowOffsetY:阴影在 y 轴方向偏移。
import QtQuick 2.9

Canvas {
    width:500
    height: 200

    onPaint: {
        var ctx = getContext("2d")
        ctx.fillStyle = "grey"
        ctx.save()
        ctx.shadowBlur = 20
        ctx.shadowColor = "blue"
        ctx.fillRect(60, 30, 100, 100)
        ctx.restore()
        ctx.save();
        ctx.shadowBlur = 20
        ctx.shadowColor = "green"
        ctx.shadowOffsetX = 15
        ctx.shadowOffsetY = 15
        ctx.fillRect(200, 30, 100, 100)
        ctx.restore()
        ctx.fillRect(350, 30, 100, 100)
    }
}

运行效果如下:

3、使用图像

在 Canvas 种可以直接使用已经存在的图形,Context2D 类型提供了 drawImage 函数用于绘制图形,该函数提供 3 个重载版本:

// 1.将 image 绘制在 Canvas 上,图像左上角位于(dx,dy)处
drawImage(variant image, real dx, real dy, real dw, real dh)

// 2.将 image 绘制在矩形(dx,dy,dw,dh)上
drawImage(variant image, real dx, real dy)

// 3.将 image 的矩形(sx,sy,sw,sh)绘制在 Canvas 的矩形(dx,dy,dw,dh)上
drawImage(variant image, real sx, real sy, real sw, real sh, real dx, real dy, real dw, real dh)

下面看一个示例:

import QtQuick 2.9

Rectangle {
    width: 300
    height: 180

    Canvas {
        id: canvas
        anchors.fill: parent
        onImageLoaded: {
            if (canvas.isImageError("http://www.baidu.com/img/bdlogo.gif")) {
                console.log("Image failed to load!")
            }
            var ctx = getContext("2d")
            ctx.drawImage("http://www.baidu.com/img/bdlogo.gif", 0, 0, 270, 129)
            canvas.requestPaint()
        }
    }

    Component.onCompleted: {
        canvas.loadImage("http://www.baidu.com/img/bdlogo.gif")
    }
}

运行效果如下:

4、坐标转换

Context2D 提供的图形变换全部是仿射变换:平移、缩放、旋转和扭曲,根据计算机图形学原理,所有的仿射变换都归结于矩阵乘法,Context2D 提供了如下两个函数:

  • setTransform(real a, real b, real c, real d, real e, real f):将转换矩阵更改为参数指定的矩阵,替换旧的变换矩阵;
  • transform(real a, real b, real c, real d, real e, real f):通过将给定的变换矩阵乘以当前矩阵,将其应用于当前矩阵;

二者关联:setTransform(a,b,c,d,e,f)方法实际上将当前变换重置为单位矩阵,然后使用相同的参数调用transform(a,b,c,d,e,f)方法。

HTML Canvas 2D上下文规范将转换矩阵定义为:

  • a 是 x 轴方向的缩放因子;
  • c 是 x 轴方向的斜切因子;
  • e 是 x 轴方向的平移因子;
  • b 是 y 轴方向的缩放因子;
  • d 是 y 轴方向的斜切因子;
  • f 是 y轴 方向的平移因子;

比例因子和偏斜因子是倍数; e 和 f 是坐标空间单位,就像平移(x,y)方法中的单位一样。

4.1、平移

使用 translate 函数进行坐标轴的平移,translate(x,y)等价于 transform(1,0,0,1,x,y)。

下面看一个示例:

import QtQuick 2.9

Canvas {
    width: 150
    height: 150

    onPaint: {
        var ctx = getContext("2d")
        ctx.fillRect(10, 10, 50, 50)
        ctx.strokeText("1", 30, 40)
        ctx.translate(70, 60);
        ctx.fillRect(10, 10, 50, 50)
        ctx.strokeText("2", 30, 40)
    }
}

运行效果如下:

4.2、缩放

使用 scale 函数进行缩放,scale(x,y)等价于 transform(ax,0,0,by,0,0)。

下面看一个示例:

import QtQuick 2.9

Canvas {
    width: 150
    height: 150

    onPaint: {
        var ctx = getContext("2d")
        ctx.fillRect(10, 10, 50, 50)
        ctx.strokeText("1", 30, 40)
        ctx.translate(70, 0)
        ctx.scale(0.5, 0.5)
        ctx.fillRect(10, 10, 50, 50)
        ctx.strokeText("2", 30, 40)
    }
}

运行效果如下:

4.3、旋转

使用 rotate 函数进行旋转,rotate(x)是将坐标轴顺时针旋转 x,等价于 transform(cos(x),sin(x),-sin(x),cos(x),0,0)。

旋转后的变换矩阵如下:

下面看一个示例:

import QtQuick 2.9

Canvas {
    width: 150
    height: 150

    onPaint: {
        var ctx = getContext("2d")
        ctx.fillRect(10, 10, 50, 50)
        ctx.strokeText("1", 30, 40)
        ctx.translate(100, 0)
        ctx.rotate(Math.PI / 4)
        ctx.fillRect(10, 10, 50, 50)
        ctx.strokeText("2", 30, 40)
    }
}

运行效果如下:

4.4、斜切

斜切也就是扭曲,使用 shear 函数进行斜切,shear(x,y)等价于 transform(1,by,cx,1,0,0)。

下面看一个示例:

import QtQuick 2.9

Canvas {
  width: 170
  height: 150

    onPaint: {
        var ctx = getContext("2d")
        ctx.fillRect(10, 10, 50, 50)
        ctx.strokeText("1", 30, 40)
        ctx.translate(70, 0)
        ctx.shear(0.5, 0.5)
        ctx.fillRect(10, 10, 50, 50)
        ctx.strokeText("2", 30, 40)
    }
}

运行效果如下:

相关推荐

方差分析简介(方差分析通俗理解)

介绍方差分析(ANOVA,AnalysisofVariance)是一种广泛使用的统计方法,用于比较两个或多个组之间的均值。单因素方差分析是方差分析的一种变体,旨在检测三个或更多分类组的均值是否存在...

正如404页面所预示,猴子正成为断网元凶--吧嗒吧嗒真好吃

吧嗒吧嗒,绘图:MakiNaro你可以通过加热、冰冻、水淹、模塑、甚至压溃压力来使网络光缆硬化。但用猴子显然是不行的。光缆那新挤压成型的塑料外皮太尼玛诱人了,无法阻挡一场试吃盛宴的举行。印度政府正...

Python数据可视化:箱线图多种库画法

概念箱线图通过数据的四分位数来展示数据的分布情况。例如:数据的中心位置,数据间的离散程度,是否有异常值等。把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)...

多组独立(完全随机设计)样本秩和检验的SPSS操作教程及结果解读

作者/风仕在上一期,我们已经讲完了两组独立样本秩和检验的SPSS操作教程及结果解读,这期开始讲多组独立样本秩和检验,我们主要从多组独立样本秩和检验介绍、两组独立样本秩和检验使用条件及案例的SPSS操作...

方差分析 in R语言 and Excel(方差分析r语言例题)

今天来写一篇实际中比较实用的分析方法,方差分析。通过方差分析,我们可以确定组别之间的差异是否超出了由于随机因素引起的差异范围。方差分析分为单因素方差分析和多因素方差分析,这一篇先介绍一下单因素方差分析...

可视化:前端数据可视化插件大盘点 图表/图谱/地图/关系图

前端数据可视化插件大盘点图表/图谱/地图/关系图全有在大数据时代,很多时候我们需要在网页中显示数据统计报表,从而能很直观地了解数据的走向,开发人员很多时候需要使用图表来表现一些数据。随着Web技术的...

matplotlib 必知的 15 个图(matplotlib各种图)

施工专题,我已完成20篇,施工系列几乎覆盖Python完整技术栈,目标只总结实践中最实用的东西,直击问题本质,快速帮助读者们入门和进阶:1我的施工计划2数字专题3字符串专题4列表专题5流程控制专题6编...

R ggplot2常用图表绘制指南(ggplot2绘制折线图)

ggplot2是R语言中强大的数据可视化包,基于“图形语法”(GrammarofGraphics),通过分层方式构建图表。以下是常用图表命令的详细指南,涵盖基本语法、常见图表类型及示例,适合...

Python数据可视化:从Pandas基础到Seaborn高级应用

数据可视化是数据分析中不可或缺的一环,它能帮助我们直观理解数据模式和趋势。本文将全面介绍Python中最常用的三种可视化方法。Pandas内置绘图功能Pandas基于Matplotlib提供了简洁的绘...

Python 数据可视化常用命令备忘录

本文提供了一个全面的Python数据可视化备忘单,适用于探索性数据分析(EDA)。该备忘单涵盖了单变量分析、双变量分析、多变量分析、时间序列分析、文本数据分析、可视化定制以及保存与显示等内容。所...

统计图的种类(统计图的种类及特点图片)

统计图是利用几何图形或具体事物的形象和地图等形式来表现社会经济现象数量特征和数量关系的图形。以下是几种常见的统计图类型及其适用场景:1.条形图(BarChart)条形图是用矩形条的高度或长度来表示...

实测,大模型谁更懂数据可视化?(数据可视化和可视化分析的主要模型)

大家好,我是Ai学习的老章看论文时,经常看到漂亮的图表,很多不知道是用什么工具绘制的,或者很想复刻类似图表。实测,大模型LaTeX公式识别,出乎预料前文,我用Kimi、Qwen-3-235B...

通过AI提示词让Deepseek快速生成各种类型的图表制作

在数据分析和可视化领域,图表是传达信息的重要工具。然而,传统图表制作往往需要专业的软件和一定的技术知识。本文将介绍如何通过AI提示词,利用Deepseek快速生成各种类型的图表,包括柱状图、折线图、饼...

数据可视化:解析箱线图(box plot)

箱线图/盒须图(boxplot)是数据分布的图形表示,由五个摘要组成:最小值、第一四分位数(25th百分位数)、中位数、第三四分位数(75th百分位数)和最大值。箱子代表四分位距(IQR)。IQR是...

[seaborn] seaborn学习笔记1-箱形图Boxplot

1箱形图Boxplot(代码下载)Boxplot可能是最常见的图形类型之一。它能够很好表示数据中的分布规律。箱型图方框的末尾显示了上下四分位数。极线显示最高和最低值,不包括异常值。seaborn中...