网站首页 > 知识剖析 正文
canvas绘图尺寸莫名其妙的缩放,让我困惑很久的问题
我一定要弄明白为什么?
本文会告诉你,canvas有两个尺寸,绘图尺寸和显示尺寸
背景
请先仔细看看这个图片,彩色部分和黑色部分,图片缩放了
上面图片整体大小: 192×108
我本来希望通过drawImage我将一个图片1920×1080,缩小到:192×108
代码如下:
this.width=192;this.height=108;
canvas.drawImage(img,0,0,this.width,this.height);
而且我的canvas 样式:
<canvas style="width: 192px; height: 108px;“ ></canvas>
我希望绘图一个: 192,108 尺寸的 canvas
然后我就: this.ctx.drawImage(img,0,0,192,108);
哈哈,结果就是上面这个图片的样子了
实际上就是你上面看到到的效果,这个并不是我要的,图片显然缺少一大块
我期望的样子:
为什么呢? 两个尺寸问题
原因:元素大小与绘图区域大小不一致的问题
可以通过一下代码你可以看出来
//绘画区域
console.log(canvas.width + "---" +canvas.height)
// 300---150
//元素区域
var box =
canvas.getBoundingClientRect(); //canvas元素的边界框
console.log(box.width + "---" + box.height); /
//192---108
这个俩个值不一致,导致了图片的自动缩放,这个自动也导致了我的困惑;
我查询了canvas相关资料:300---150 这个是默认值,我的老天
进一步理解这些内容?
1、canvas元素指html中用css设置的尺寸,用于界面显示
2、绘图区域尺寸需要在js中设置,用于画图;
3、如果这个两个值一致,那么图片不会自动缩放了,你画多少显示就是多少大了;
解决的思路和方法
1、不要用css去设置他们的样式,采用js直接设置canvas的大小;(方案1:实际上基本采用这个方式)
2、绘图时候目标绘图大小进行转换,抵消自动缩放带来的后果 (方案2)
方案1:讨论
将原来的: <canvas style="width: 192px; height: 108px;“ ></canvas>
修改成: <canvas width=”192px“ height=”108px“ ></canvas>
通过以上可以看出,这两个设置是不一样的;
方案二:讨论
自动缩放规律
结果尺寸 = 绘画尺寸(canvas元素/ 绘图表面)
如果要保证自动缩放后还是你期望的结果,那么就采用下面绘图公式(方案二)
那么: 实际绘画尺寸 = 绘画尺寸(绘图表面 / canvas元素)
我实际项目做法:
this.$el 是一个canvas对象
//显示尺寸
this.$el.style.width = width + 'px';
this.$el.style.height = this.height + 'px';
//绘图尺寸=画布尺 这两个值一定是要一样的
this.$el.width = width;//注意没有尺寸单位
this.$el.height = this.height;//注意没有尺寸单位
总结:
canvas 有两个尺寸: 显示区域尺寸和绘图尺寸,请确保他们一样;
猜你喜欢
- 2025-07-28 微信小程序canvas使用(小程序view转canvas)
- 2025-07-28 一文带你搞懂JS实现压缩图片(js怎么压缩图片)
- 2025-07-28 leaflet地图截图批量导出(leaflet地图旋转)
- 2025-07-28 DeepSeek生成Word方案(deep word)
- 2025-07-28 收好这个提示词!让DeepSeek帮我们生成精美网页表格!
- 2025-07-28 ImageJ | Western Blot 条带分析(westernblot条带数据分析)
- 2025-07-28 LameHug被发现,滥用阿里Qwen模型搜刮Win10/Win11设备数据
- 2025-07-28 基于Transformers.js的移除照片背景
- 2025-07-28 AI 时代已来!不容忽视的 TypedArray 的底层力量?
- 2025-07-28 PaintCode 用户操作指南(.painter)
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)