面试中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 相关文章推荐
利用ajaxfileupload插件实现文件上传无刷新的具体方法
Jun 08 Javascript
Jquery实现显示和隐藏的4种简单方式
Aug 28 Javascript
JS实现同时搜索百度和必应的方法
Jan 27 Javascript
JavaScript清空数组元素的两种方法简单比较
Jul 10 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
Oct 22 Javascript
jQuery获得字体颜色16位码的方法
Feb 20 Javascript
JS HTML5实现拖拽移动列表效果
Aug 27 Javascript
package.json各个属性说明详解
Mar 11 Javascript
JS实现随机点名器
Apr 12 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
Apr 25 Javascript
layui实现显示数据表格、搜索和修改功能示例
Jun 03 Javascript
Vue组件跨层级获取组件操作
Jul 27 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
angularJS模态框$modal实例代码
2017/05/27 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
几道数据库的面试题或笔试题
2014/05/31 面试题
协议书范本
2014/04/23 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
工商管理专业自荐信
2014/06/03 职场文书
物资采购方案
2014/06/12 职场文书
服装设计专业自荐信
2014/06/17 职场文书
竞选班干部演讲稿100字
2014/08/20 职场文书
个人查摆剖析材料
2014/10/16 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
房屋质量投诉书
2015/07/02 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android