面试中canvas绘制图片模糊图片问题处理


Posted in Javascript onMarch 13, 2022

问题:canvas绘制图片,图片变模糊

设定一个一定尺寸的canvas,我这里设置的画布大小是400px*400px。当一张图片完全画到画布上的时候,大概率都会出现图片模糊的情况。
我拿下面一张图片画到canvas上作为例子,看上去应该比较明显的有模糊的感觉。

面试中canvas绘制图片模糊图片问题处理

单方面的去修改图片精度,换成更高清的图片,事实证明确实有一丢丢用,但是效果不是很明显。况且我当时那个图片由于是手绘的,大小有5M,也不会切片加载图片,直接整个加载非常耗时。

那么如何去处理这样的问题呢?

生活中应该大家都遇到过这样的情况,同样的1080p的视频,在大屏显示器上看和手机上看效果是不一样的,大屏往往会让人感觉一种模糊感。而在手机小屏幕上,就会感觉异常的清晰。

要点:两个点

通过上面的一个例子,我们可以将图片放大,然后再绘制进原先大小的canvas中,这样图片的精度受损会比较小

了解canvas的绘制原理(*打星号)

canvas其实就是一张画布,所以如果可以的话,你可以将它放大,可以发现它也是有一个个的像素组成的。

面试中canvas绘制图片模糊图片问题处理

如上图,可以看到一个个的网格。假设我们需要在上面绘制一条1px的线条,就会得到上面的效果。
但是canvas是的绘制方式是从中线开始绘制,并向两侧延伸的。 

面试中canvas绘制图片模糊图片问题处理

他会以图中的红线作为中线,向两边延伸,从而得到1px的纵向线条。但是像素是不允许0.5px的出现的,所以它索性就直接再延伸一点,将像素给填满。所以你看到的效果是下面这种?

面试中canvas绘制图片模糊图片问题处理

所以当一张图片被绘制到canvas中的时候,很多区域都会被绘制两次,所以出现重叠导致你看到的图片是模糊的。
其实马赛克的原理也是,相邻像素点之间的颜色进行运算进行交叉覆盖,起到打码的效果。
所以有几种不同的解决方案。

解决方案

方法一

在绘制的时候,如果是线条,可以通过移动0.5px找准中线来达到目的,例如:

ctx.moveTo(100.5,100.5);
ctx.lineTo(200.5,100.5);

方法二

如果是图片,可以通过放大一倍canvas大小,但是通过css保持canvas大小不变,然后再绘制进canvas中,这样在canvas放大一倍的情况下绘制进去图片,然后通过css缩小canvas到原来大小达到目的。

示例

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>canvas绘制图片模糊</title>
  </head>
  <body>
    <img
      id="img"
      src="https://desk-fd.zol-img.com.cn/t_s960x600c5/g2/M00/09/0C/Cg-4WVV6jWmIczjzAAdzu1eYHzwAAFK1wD9poMAB3PT053.jpg"
      width="100px"
      height="100px"
      style="visibility: hidden;"
    />
    <canvas id="canvas" width="400px" height="400px"></canvas>
    <canvas
      id="canvas2"
      width="800px"
      height="800px"
      style="width: 400px; height: 400px;"
    ></canvas>
  </body>
  <script>
    function init() {
      console.log(1234);
      let canvas = document.getElementById("canvas");
      let img = document.getElementById("img");
      let context = canvas.getContext("2d");
      context.drawImage(img, 0, 0, 400, 400);
 
      let canvas2 = document.getElementById("canvas2");
      let context2 = canvas2.getContext("2d");
      context2.drawImage(img, 0, 0, 800, 800);
    }
    window.onload = init;
  </script>
</html>

为了方便,就都写在一个html中了,图片也是找的网图。左边是未处理,也就是代码中的canvas效果,右边是通过方法2处理后的,也就是canvas2效果,请自行鉴别嗷。

面试中canvas绘制图片模糊图片问题处理

方法三

可以通过 transform:scale(0.5)的方式对图片进行缩放,再绘制到canvas中

以上就是面试中canvas绘制图片模糊图片问题处理的详细内容,更多关于面试canvas绘制图片模糊解决的资料请关注三水点靠木其它相关文章!

 

Tags in this post...

Javascript 相关文章推荐
jQuery学习笔记[1] jQuery中的DOM操作
Dec 03 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
Oct 17 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
Feb 13 Javascript
一个仿糯米弹框效果demo
Jul 22 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
Feb 28 Javascript
jQuery快速实现商品数量加减的方法
Feb 06 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
Jun 23 jQuery
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
Jul 10 Javascript
bootstrap+jquery项目引入文件报错的解决方法
Jan 22 jQuery
React和Vue中监听变量变化的方法
Nov 14 Javascript
使用xampp将angular项目运行在web服务器的教程
Sep 16 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
Jun 02 Javascript
Javascript中async与await的捕捉错误详解
Mar 03 #Javascript
Vue如何清空对象
Mar 03 #Vue.js
Vue中Object.assign清空数据报错的解决方案
Mar 03 #Vue.js
javascript之Object.assign()的痛点分析
Mar 03 #Javascript
vue实现移动端div拖动效果
Mar 03 #Vue.js
vue实现滑动解锁功能
JavaScript最完整的深浅拷贝实现方式详解
Feb 28 #Javascript
You might like
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
php数组去重复数据示例
2014/02/25 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
Yii快速入门经典教程
2015/12/28 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
JavaScript 调试器简介
2009/02/21 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
js实现图片360度旋转
2017/01/22 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
JavaScript 中使用 Generator的方法
2017/12/29 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
Python程序控制语句用法实例分析
2020/01/14 Python
奇怪的鱼:Weird Fish
2018/03/18 全球购物
公务员个人自我评价分享
2013/11/06 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
励志演讲稿200字
2014/08/21 职场文书
审计班子对照检查材料
2014/08/27 职场文书
人力资源部岗位职责
2015/02/11 职场文书
学校德育工作总结2015
2015/05/11 职场文书
比赛主持人开场白
2015/05/29 职场文书
实习员工转正的评语汇总,以备不时之需
2019/12/17 职场文书