执行效果:


1.gif

操作指南

数字越大越模糊噢~

HTML 部分

<body>
<div>
<input id="file" type="file" accept="image/*" /><canvas id="canvas"></canvas><img id="img-raw" /><label for="compress-times">压缩倍数:</label><input id="compress-times" type="number" value="12"><button>马赛克化</button>
</div>
</body>

CSS 部分

<style>body{display:flex;align-items: center;justify-content: center;}
img {display: none;}canvas {display: block;border: gray solid 1px;width: 600px;height: 600px;image-rendering: pixelated;}
</style>

JS 部分

<script type="text/javascript">let imgBlobUrl;const file = document.getElementById('file');const img = document.getElementById('img-raw');const compressTimes = document.getElementById('compress-times');const defaultCompressTimes = compressTimes.value | 0;const canvas = document.getElementById('canvas');const button = document.querySelector('button');const boundingRect = canvas.getBoundingClientRect();const ctx = canvas.getContext('2d');const canvas_w = boundingRect.width;const canvas_h = boundingRect.height;// 以 background-size: contain 形式设置图片尺寸function matchImgSizeToCanvas(imgElem = img) {let w = imgElem.width;let h = imgElem.height;if (w > canvas_w || h > canvas_h) {let radio = Math.max(h / canvas_h, w / canvas_w);radio = Number(radio.toFixed(2));imgElem.width = parseInt(w / radio);imgElem.height = parseInt(h / radio);}}// 绘制 1/N 大小的图像,画布宽高属性设为样式宽高的 1/N,从而实现画布内容的 N 倍放大function run() {let ct = parseInt(compressTimes.value) || defaultCompressTimes;canvas.width = parseInt(canvas_w / ct);canvas.height = parseInt(canvas_h / ct);ctx.drawImage(img, 0, 0, parseInt(img.width / ct), parseInt(img.height / ct));}function cleanCanvas() {ctx.clearRect(0, 0, canvas_w, canvas_h);}function reset() {img.removeAttribute('width');img.removeAttribute('height');cleanCanvas();matchImgSizeToCanvas(img);run();}file.addEventListener('change', function (e) {window.URL.revokeObjectURL(imgBlobUrl);const picFile = this.files[0];imgBlobUrl = window.URL.createObjectURL(picFile);img.onload = function init() {reset();}img.src = imgBlobUrl;}, false);button.addEventListener('click', reset, false);
</script>

注意:

要将js代码放在html的body以后,不然在html页面未被加载出来时,js操作会报错。

用 CSS 实现图片的马赛克风格相关推荐

  1. 【源码共享】我花2小时写了微信官网的响应式布局HTML+CSS 换成旅行主题风格更炫酷了

    微信官网仿写效果 ↑ 移动端响应式效果 ↑ 微信官网首页,简约干净,能学习写好这个首页,就能掌 握HTML网页设计前端盒子的布局.嵌套,及css效果的 使用... 微信官网首页主要有以下几个需要关注的 ...

  2. java实现马赛克,java如何用Processing生成马赛克风格的图像

    java如何用Processing生成马赛克风格的图像 首先使用PImage来实例化对象,再通过loadImage赋值,两层for循环遍历图片上的像素点,每隔5个像素点,画一个直径为3的圆.颜色通过p ...

  3. CSS+JS仿QQ面板风格的多级折叠下拉菜单

    <html><head><title>CSS+JS仿QQ面板风格的多级折叠下拉菜单丨石家庄玻璃隔断|石家庄自动门</title><style ty ...

  4. vue-cli中解决css引用图片打包后找不到文件资源的问题

    1.在CSS中引入图片 #slider1 {background-image: url(./bg02.jpg);background-size: cover; } 注意:此处的图片与索引文件在同一个目 ...

  5. html css 背景图片

    html css 背景图片 文章目录 html css 背景图片 视频 代码 视频 https://www.bilibili.com/video/BV1MJ411M7qi?from=search&am ...

  6. css中图片整合的使用,CSS Sprites:图片整合技术详细案例

    CSS Sprites 的目的就是通过整合图片,减少对服务器的请求数量,从而加快页面加载速度.介绍了CSS Sprites技术的实现方法,优点和缺点.最后通过实例CSS Sprites技术制作导航栏演 ...

  7. 利用wget 抓取 网站网页 包括css背景图片

    利用wget 抓取 网站网页 包括css背景图片 wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有.不过用它来dump比较现代的网站会有一个问题:不支持c ...

  8. 转: 用css把图片转为灰色图

    小tip: 使用CSS将图片转换成黑白(灰色.置灰) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.c ...

  9. js和css和img,Node.js压缩web项目中的js,css和图片

    安装node.js 这个非常简单,下载下来,配置下环境变量就可以了,使用node -v查看是否安装成功 安装压缩需要的模块分别是uglify-js,clean-css,node-smushit 命令是 ...

最新文章

  1. spark读取hdfs路径下的数据_Spark读取HDFS数据分区参考
  2. java使用eclipse打jar包_Eclipse对Java项目打Jar包
  3. 解决oninput在输入中文时,会获取拼音的问题
  4. Extjs EditorGridPanel中ComboBox列的显示问题
  5. springboot-异常处理使用与原理解析
  6. 四十五、和我一起看看,国外的Python考试到底是怎么样(上篇)
  7. 网页设计上机考试原题_《网页设计》上机考试试题
  8. Friendly Group Gym - 102769F 2020(并查集)ccpc秦皇岛分站赛
  9. javafx 自定义控件_JavaFX技巧10:自定义复合控件
  10. java返回类型自动_java-Apache Flink:由于类型擦除,无法自动确定函数的返回类型...
  11. python 学习(pip工具的安装)
  12. centos7完全卸载mysql_Centos7 完全卸载mysql
  13. InVEST模型在固碳、生境质量、产水等领域案例分析
  14. 程序员一毕业就年薪 110 万竟然是靠……
  15. Sigfox的物联网生意经:弱水三千只取一瓢饮
  16. Android可上下左右滑动的列表
  17. Web 3D集成开发环境【nunuStudio中文版】
  18. WindowsForm 入门
  19. 常用算法——解析算法
  20. HR干货,怎样做好企业员工的晋升

热门文章

  1. Thinkphp 操作提示 ThinkPHP 3.2.0 { Fast Simple OOP PHP Framework } -- [ WE CAN DO IT JUST THINK ]
  2. 【分享】神龙斗士123部下载链接,魔神英雄传辽宁艺术90年代配音版
  3. 开源软件新时代 55个经典开源Windows工具
  4. java 绘图板_非常值得学习的java 绘图板源代码
  5. 楞严咒全文正确注音版_楞严咒全文注音
  6. 【好玩的策略模拟经营游戏】造物主 Reus for Mac
  7. Fedora和Red Hat Enterprise Linux实用指南(第6版)(上、下册)( 入行必读的Linux圣经)
  8. 知否:高增长时代已过,汽车互联网玩家如何开拓更多增量?
  9. 2.管理者的分类与角色
  10. 华硕电脑无线网卡代码10