关于canvas绘制图像模糊问题
前段时间在做项目的裁剪并上传图像功能的时候,发现裁剪后展示的图像比较模糊,之后去百度上搜索了一下,看到有一个解决方案是设置canvas的宽高为css宽高的3倍,使用后感觉效果很好,当时就没管原理接着做功能去了。
在昨天,我想试试做一个鼠标划入图片,图片已鼠标为中心,部分区域放大的demo(类似淘宝商品展示页面的那种)。在制作过程中,我又遇到了canvas转图片模糊的问题,因为当时在解决上个的问题的时候使用了谷歌搜索问题,便又用谷歌搜索了一下(当时忘了刚解决过同样的问题),发现出现这个问题的的原因在于当前显示设备的物理分辨率与CSS分辨率不同,这两个分辨率的比值可在JS中使用window.devicePixelRatio获取,该属性返回一个当前显示设备的物理像素分辨率与CSS像素分辨率的比值。该值也可以被解释为像素大小的比例:即一个CSS像素的大小相对于一个物理像素的大小的比值。在获取这个属性的值后,对canvas的宽高进行对应的缩放就可以得到不会模糊的图片啦。
这是示例代码:
- // img为用于展示canvas绘图结果的img元素
- const img = document.querySelector('#img');
- // 创建canvas
- const canvas = document.createElement('canvas');
- const ctx = canvas.getContext('2d');
- const width = 400;
- const height = 800;
- // 设置canvas的css宽高
- canvas.style.width = `${width}px`;
- canvas.style.height = `${height}px`;
- // 获取缩放比
- const ratio = window.devicePixelRatio || 1;
- // 设置canvas的宽高
- canvas.width = width * ratio;
- canvas.height = height * ratio;
- ... // 在canvas中绘图
- img.src = canvas.toDataURL("image/png");
关于canvas绘制图像模糊问题的更多相关文章
- HTML5学习总结——canvas绘制象棋(canvas绘图)
一.HTML5学习总结——canvas绘制象棋 1.第一次:canvas绘制象棋(笨方法)示例代码: <!DOCTYPE html> <html> <head> & ...
- 用canvas绘制折线图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 封装 用canvas绘制直线的函数--面向对象
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 学习笔记:HTML5 Canvas绘制简单图形
HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...
- canvas绘制经典折线图(一)
最终效果图如下: 实现步骤如下:注-引用了jQuery HTML代码 <!doctype html> <html lang="en"> <head&g ...
- Canvas绘制图形
1.Canvas绘制一个蓝色的矩形 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...
- [canvas]利用canvas绘制自适应的折线图
前段时间学习了用canvas绘制折现图,且当画布变换大小,折现图会随之变化,现附上代码 <!DOCTYPE html> <html lang="en"> & ...
- 使用Canvas绘制背景图
原文 http://www.imququ.com/post/use-canvas-as-background-image.html 最近iCloud Web的Beta版换了UI,整体风格变得和iOS ...
- html5的canvas绘制迷宫地图
canvas标签一直是html5的亮点,用它可以实现很多东西.我想用它来绘画像迷宫那样的地图.借助到的工具有瓦片地图编辑器tiled(点击跳转到下载链接). 如图:如果你想要画像这样的迷宫地图,如果不 ...
随机推荐
- 64位 __int 与 long long写法
在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647.而unsig ...
- Dubbox服务的消费方配置
在src/main/resources下创建applicationContext-web.xml <?xml version="1.0" encoding="UTF ...
- mysql 中字符串拼接,查询sql语句总结
DELIMITER $$ USE `ld_wpfmgl_sys`$$ DROP PROCEDURE IF EXISTS `code_query`$$ CREATE DEFINER=`root`@`%` ...
- react-devtools超级简单安装教程
有时候看网上各路大神,写如何安装react-devtools,大神就是大神,好多步骤一笔带过,导致一些学习者看的一脸懵逼,今天我给大家讲超级简单的react-devtools安装步骤,相信看过的小伙伴 ...
- python3 投票
import urllib.request # cd C:\Python36-32\Scripts # pip install BeautifulSoup from bs4 import Beauti ...
- 【dart学习】-- Dart之类和对象
一,概述 类(Class)是面向对象程序设计,实现信息封装的基础.类是一种用户定义的类型.每个类包含数据说明和一组操作数据或传递消息的函数.类的实例称为对象. Dart的类与其它语言都有很大的区别,比 ...
- error C2872: “ACCESS_MASK”: 不明确的符号
原因:opencv3.0或者3.1的using namespace cv和windows.h中ACCESS_MASK定义冲突. 解决方案:注释掉所有的using namespace cv,然后在需要的 ...
- vue2 开发总结
vue-cli学习资料: http://m.php.cn/article/394750.html 或 https://www.cnblogs.com/zhanglin123/p/9270051.ht ...
- js和php语法区别
参考 : https://www.wangjingxian.cn/php/51.html
- RF中alert的处理
那么在robotframework中如何处理呢? 我在测试过程中遇到了这么一个窗口: 这种应该是属于Confirm 类型,是无法定位到的,在robotframework中需要这样处理: 1.虽然无法定 ...