【第4章 图像与视频】4.2 图像的缩放

article/2025/8/26 22:05:40

文章目录

  • 前言
  • 示例-图像的缩放
  • 在 Canvas 边界之外绘制图像


前言

在上节中读者已经学会了如何使用 drawImage() 方法将一幅未经缩放的图像绘制到 canvas 之中。现在我们就来看看如何用该方法在绘制图像的时候进行缩放


示例-图像的缩放

未缩放的图像,显示图形原有大小。

在这里插入图片描述

缩放后的图像,将图形的宽高放到到和 canvas 大小一致。

在这里插入图片描述

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><title>4-2-图像的缩放</title><style>body {background: #eeeeee;}#canvas {background: #ffffff;margin-top: 5px;margin-left: 10px;-webkit-box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.5);-moz-box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.5);box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.5);border: 1px solid rgba(0, 0, 0, 0.2);}</style></head><body><div id="controls"><input id="scaleCheckbox" type="checkbox" />缩放图片</div><canvas id="canvas" width="1000" height="600">canvas not supports</canvas><script>'use strict'let canvas = document.getElementById('canvas'),context = canvas.getContext('2d'),image = new Image(),scaleCheckbox = document.getElementById('scaleCheckbox')let drawImage = () => {context.clearRect(0, 0, canvas.width, canvas.height)if (scaleCheckbox.checked) {context.drawImage(image, 0, 0, canvas.width, canvas.height)} else {context.drawImage(image, 0, 0)}context.restore()}scaleCheckbox.onchange = (e) => {drawImage()}image.src = './waterfall.png'image.onload = () => {context.drawImage(image, 0, 0)}</script></body>
</html>

在 Canvas 边界之外绘制图像

图像可以绘制在 canvas 之内,也可以通过指定坐标值将图像绘制在它之外。在应用程序放大倍数大于 1.0 的情况下,就会把图像的绘制点指定到 canvas 外面去。

如果你向 canvas 之中绘制的图像有一部分会落在 canvas 的范围之外,那么浏览器就会将 canvas 范围外的那部分图像忽略。

可以在 canvas 范围之外进行绘制,这是一项重要的功能。我们把图像绘制在 canvas 范围外,并且通过平移 canvas 的坐标系来让背景中的某一部分内容显示在当前视窗范围内。

示例:将缩放后的图片绘制于Canvas中央

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>4-4-图像的缩放</title><style>/* 设置页面背景颜色 */body {background: rgba(100, 145, 250, 0.3);}/* 调整滑动条的对齐和大小 */#scaleSlider {vertical-align: 10px;width: 100px;margin-left: 90px;}/* 设置画布的边距、边框和光标样式 */#canvas {margin: 10px 20px 0px 20px;border: thin solid #aaa;cursor: crosshair;}/* 调整控制面板的边距和内边距 */#controls {margin-left: 15px;padding: 0;}/* 设置缩放比例显示框的位置、大小和样式 */#scaleOutput {position: absolute;width: 60px;height: 30px;margin-left: 10px;vertical-align: center;text-align: center;color: blue;font: 18px Arial;text-shadow: 2px 2px 4px rgba(100, 140, 250, 0.8);}</style></head><body><div id="controls"><div id="scaleOutput">1.0</div><input type="range" id="scaleSlider" min="1" max="3.0" step="0.1" value="1.0" /></div><canvas id="canvas" width="800" height="520"> canvas not supports </canvas><script>// 获取HTML元素const canvas = document.getElementById('canvas'),context = canvas.getContext('2d'),scaleSlider = document.getElementById('scaleSlider'),scaleOutput = document.getElementById('scaleOutput'),MIN_SCALE = 1.0,MAX_SCALE = 3.0let scale = 1.0const image = new Image()// 绘制图像的函数function drawImage() {const w = canvas.width,h = canvas.height,sw = w * scale,sh = h * scalecontext.clearRect(0, 0, w, h)context.drawImage(image, w / 2 - sw / 2, h / 2 - sh / 2, sw, sh)}// 更新缩放比例文本的函数function drawScaleText(value) {const text = parseFloat(value).toFixed(1)let percent = parseFloat(value - MIN_SCALE) / parseFloat(MAX_SCALE - MIN_SCALE)scaleOutput.textContent = textpercent = percent < 0.35 ? 0.35 : percentscaleOutput.style.fontSize = (percent * MAX_SCALE) / 1.5 + 'em'}// 滑动条的事件处理函数scaleSlider.onchange = (e) => {scale = e.target.valueif (scale < MIN_SCALE) {scale = MIN_SCALE} else if (scale > MAX_SCALE) {scale = MAX_SCALE}drawScaleText(scale)drawImage()}// 初始化画布样式context.fillStyle = 'rgba(100, 140, 250, 0.5)'context.strokeStyle = 'yellow'context.shadowColor = 'rgba(50, 50, 50, 1.0)'context.shadowOffsetX = 5context.shadowOffsetY = 5context.shadowBlur = 10// 设置图像源image.src = 'waterfall.png'// 图像加载完成后的事件处理函数image.onload = () => {drawImage()drawScaleText(scaleSlider.value)}</script></body>
</html>


http://www.hkcw.cn/article/SHeirMusVC.shtml

相关文章

kali系统的安装及配置

1 kali下载 Kali 下载地址&#xff1a;Get Kali | Kali Linux &#xff08;https://www.kali.org/get-kali&#xff09; 下载 kali-linux-2024.4-installer-amd64.iso (http://cdimage.kali.org/kali-2024.4/) 2. 具体安装步骤&#xff1a; 2.1 进入官方地址&#xff0c;点击…

Python训练营打卡 Day39

图像数据与显存 知识点回顾 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 图像数据与显存 1. 图像数据的格式 灰度图像&#xff1a;就像餐厅只提供黑白两色的…

46. Permutations和47. Permutations II

目录 46. Permutations 方法一、使用used数组回溯 方法二、不使用used数组回溯 47. Permutations II 回溯法 46. Permutations 方法一、使用used数组回溯 class Solution {vector<vector<int>> res;vector<int> apermutation; public:vector<vector…

微服务测试困境?Parasoft SOAtest的自动化、虚拟化与智能分析来袭!

微服务架构凭借其敏捷性和可扩展性&#xff0c;已成为企业技术升级的核心选择&#xff0c;但同时也引入了测试复杂性&#xff0c;比如多协议支持、环境依赖、频繁变更等。Parasoft SOAtest正是为企业所需的一站式覆盖、环境隔离能力以及智能维护而生&#xff0c;它通过自动化测…

霹雳吧啦Wz_深度学习-图像分类篇章_1.1 卷积神经网络基础_笔记

深度学习-图像分类篇章 参考笔记 卷积神经网络 英文&#xff1a;Convolutional Neural Network&#xff0c;CNN雏形&#xff1a;1998年LeCun的LeNet5&#xff0c;第一个卷积神经网络包含&#xff1a; 卷积层&#xff1a;Convolutions下采样层&#xff1a;Subsampling全连阶层…

系统安装出现的问题 老毛桃

有的电脑这样&#xff0c;不一定能进入u盘启动&#xff0c;需要再 save Exid栏目里&#xff0c;点击那个use disk2.0

RFID手持终端设备多功能融合技术实现智能管理

RFID&#xff08;无线射频识别&#xff09;手持终端设备作为连接物理世界与数字世界的桥梁&#xff0c;正通过多功能融合技术实现从单一功能工具向智能化综合管理终端的跨越。上海岳冉多功能融合RFID手持终端&#xff0c;通过集成RFID识别、条码扫描、环境感知、视觉辅助等模块…

【AI论文】ScienceBoard:评估现实科学工作流程中的多模态自主代理

摘要&#xff1a;大型语言模型&#xff08;LLMs&#xff09;的影响已经超出了自然语言处理&#xff0c;极大地促进了跨学科研究的发展。 最近&#xff0c;各种基于LLM的代理已经被开发出来&#xff0c;以协助科学发现跨越多个方面和领域的进步。 其中&#xff0c;能够像人类一样…

2025年公共管理与信息技术国际会议:智能治理与数据驱动的创新之路

会议简介 第二届公共管理与信息技术国际会议即将盛大启幕。作为全球公共管理领域内的一次重要学术盛会&#xff0c;本届会议将聚集世界各地的政府官员、专家学者、行业精英以及技术开发者&#xff0c;共同探讨信息技术如何赋能公共管理&#xff0c;推动社会治理现代化。 本次会…

动态规划法在解决实际问题中的应用

实际上&#xff0c;我们可以从根结点出发&#xff0c;深度优先搜索这棵二叉树。对于每棵子树&#xff0c;其子树元素和等于子树根结点的元素值&#xff0c;加上左子树的元素和&#xff0c;以及右子树的元素和。 每个房子可以被粉刷成三种颜色中的一种&#xff0c;需要计算在满…

尝鲜纯血鸿蒙,华为国际版本暂时不支持升级。如mateX6 国际版?为什么不支持?什么时候支持?

一&#xff1a;mateX6 国际版支持鸿蒙吗&#xff1f; 不支持 二&#xff1a;华为国际版支持鸿蒙吗&#xff1f; 不支持 三&#xff1a;华为国际版什么时候支持&#xff1f; 2025年预期可以支持。请耐心等待。 三&#xff1a;国际版为什么不支持&#xff1f; EMUI 采用AO…

足迹地图:记录旅程,点亮世界

旅行&#xff0c;是探索世界的脚步&#xff0c;也是心灵的归宿。每一次的出发与归来&#xff0c;都承载着无数的回忆与故事。而足迹地图这款旅行记录软件&#xff0c;就像一位忠实的旅伴&#xff0c;陪伴着你记录下每一段旅程&#xff0c;将你的足迹点亮在世界的地图上&#xf…

Qt 读取和写入 INI 格式的配置文件

Qt 读取和写入 INI 格式的配置文件 前言&#xff1a;INI 配置文件在 Qt 开发中的重要性基础夯实&#xff1a;INI 文件结构与 QSettings 核心概念1. INI 文件的基本结构2. QSettings 类概述3. 初始化 QSettings 对象4. 基本读写操作5. 高级操作技巧5.1 处理数组和列表5.2 检查键…

计算机网络之差错控制中的 CRC(循环冗余校验码)

文章目录 1 概述1.1 简介1.2 特点1.3 基本原则 2 实现步骤3 例题 1 概述 修改中&#xff0c;请稍等。。。 1.1 简介 CRC&#xff1a;Cyclic Redundancy Check&#xff08;循环冗余校验&#xff09;是计算机网络中常用的一种差错控制编码方法&#xff0c;用于检测数据传输或存…

VLC-QT 网页播放RTSP

先看效果图,代码在文章末尾,包含源码,vlc-qt完整的库 环境说明:VS 2017 QTQt5.13.0 MSVC2017 32位 将vlc_install 目录下的bin,include,lib里所有的东西分别放在qt目录下 bin -> C:\Qt\Qt5.13.0\5.13.0\msvc2017\bin include->C:\Qt\Qt5.13.0\5.13.0\msvc201…

塔能科技:为多行业工厂量身定制精准节能方案

在当今追求可持续发展的时代&#xff0c;工厂能耗精准节能成为众多企业关注的焦点。塔能科技凭借先进的技术和丰富的经验&#xff0c;服务于广泛的行业客户&#xff0c;其中55.5%来自世界500强和上市公司。针对不同行业工厂的特点和需求&#xff0c;塔能提供了一系列行之有效的…

Qt font + ToolTip + focusPolicy + styleSheet属性(5)

文章目录 font属性API接口直接在Qt Designer编辑图形化界面通过纯代码的方式修改文字属性 ToolTip属性API接口代码演示 focusPolicy属性概念理解API接口通过编辑图形化界面演示 styleSheet属性概念理解通过编辑图形化界面展示代码 图形化界面的方式展示&#xff08;夜间/日间模…

lwip_setsockopt设置地址复用出错(lwip默认不打开,lwip_bindu也会提示端口被占用)

/* 3. 设置地址复用 */ flags lwip_setsockopt(new_sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); if (flags < 0) {NET_DEBUG_PRINT("[NET] SO_REUSEADDR failed: %s\n", strerror(errno));int opt_err errno;// 详细错误分析switch(opt_err) {c…

力扣面试150题--二叉树的右视图

Day 53 题目描述 思路 采取层序遍历&#xff0c;利用一个high的队列来保存每个节点的高度&#xff0c;highb和y记录上一个节点的高度和节点&#xff0c;在队列中&#xff0c;如果队列中顶部元素的高度大于上一个节点的高度&#xff0c;说明上一个节点就是上一层中最右边的元素…

Powerbuilder 连接达梦数据库(ODBC 和 JDBC)

一、ODBC PB只支持32位驱动&#xff0c;可以同时安装64和32位驱动&#xff0c;分别下载64和32位安装包安装 1、选择DMB ODBC DRIVER驱动 2、不描述&#xff0c;看图输信息即可 3、连接代码 SQLCA.DBMS "ODBC" SQLCA.AutoCommit False SQLCA.DBParm "Conne…