前言

说起图片的马赛克,可能一般都是由后端实现然后传递图片到前端,但是前端也是可以通过canvas来为图片加上马赛克的,下面就进行一个简单的实现。

思路

最开始需要实现马赛克功能是需要通过canvas提供的一个获取到图片每一个像素的方法,我们都知道,图片本质上只是由像素组成的,越清晰的图片,就有着越高的像素,而像素的本质,就只是一个个拥有颜色的小方块而已,只要把一张图片放大多倍,就能够清楚的发现。

canvas实现

通过 canvas 的 getImageData 这个方法,我们就能够拿到图像上所有像素组成的数组,并且需要生成马赛克,意味着我们需要把一个范围内的色块的颜色都改成一样的,也就是通过canvas来重绘图片,

 let pixeArr = ctx.getImageData(0, 0, w, h).data;
let sampleSize = 40;for (let i = 0; i < h; i += sampleSize) {for (let j = 0; j < h; j += sampleSize) {let p = (j + i * w) * 4;ctx.fillStyle ="rgba(" +pixeArr[p] +"," +pixeArr[p + 1] +"," +pixeArr[p + 2] +"," +pixeArr[p + 3] +")";ctx.fillRect(j, i, sampleSize, sampleSize);}
}
复制代码

通过双重循环来循环图片所有的色块,其中的跨度就是我们设定好的色块大小,色块调整的越大,马赛克后图片更模糊,越小,图片的模糊度就会降低。在通过 fillStyle 选取颜色,以及 fillRect 重绘 canvas 实现了将整个 canvas 的色块都进行改变,最后在导出重绘后的图片,无论是改变原来的图片地址,或者是新加一张图片作为对比,就都是可行的了。

canvas 跨域问题

在使用 getImageData 获取图片的时候,如果使用的是线上图片,浏览器会爆出跨域的错误:

而上文中出现问题的图片是存放在本地的或者线上的,本地的图片默认是没有域名的,线上的图片并且是跨域的,所以浏览器都认为你是跨域,导致报错。

那么对于本地图片,我们只需要将图片放到和html对应的文件夹下,子文件夹也是不可以的,就能够解决,对于线上的图片,我们可以采用先把它下载下来,再用方法来获取数据的这种方式来进行。

function getBase64(imgUrl) {return new Promise(function (resolve, reject) {window.URL = window.URL || window.webkitURL;let xhr = new XMLHttpRequest();xhr.open("get", imgUrl, true);xhr.responseType = "blob";xhr.onload = function () {if (this.status == 200) {let blob = this.response;let oFileReader = new FileReader();oFileReader.onloadend = function (e) {let base64 = e.target.result;resolve(base64);};oFileReader.readAsDataURL(blob);}};xhr.send();});
}
复制代码

下载图片就不说了,通过浏览器提供的 API 或者其他封装好的请求工具都是可以的,在请求成功之后,我们将图片转化为 base64 并且返回,这样就能够获取线上图片的数据了。

总结

本文提供了一种前端生成马赛克图片的方案,并且对于线上的图片,也能够通过先异步下载图片在进行转换的策略,实现了图片添加马赛克的功能。

前端线上图片生成马赛克相关推荐

  1. 前端线上图片怎么生成马赛克?

    前言 说起图片的马赛克,可能一般都是由后端实现然后传递图片到前端,但是前端也是可以通过canvas来为图片加上马赛克的,下面就通过码上掘金来进行一个简单的实现. 实现 实现过程 <img src ...

  2. Web前端线上系统课-01-HTML+CSS/06-CSS盒子模型-CSS设置背景

    CSS盒子模型-CSS设置背景 盒模型 margin <!DOCTYPE html> <html lang="en"><head><met ...

  3. 前端线上问题如何调试

    记录Vue开发过程中遇到的问题,测试环境以及本地显示都没有问题,但是一上线就出现问题,于是对于这个问题进行排查,在此记录排查问题的步骤以及方法,希望对大家有帮助. 错误信息:Uncaught Type ...

  4. Web前端线上系统课-01-HTML+CSS/08-结构伪类-图形-字体-字体图标-元素定位

    结构伪类-图形-字体-字体图标-元素定位 结构性伪类选择器 nth-child 父元素中的第n个子元素 nth-child(n) <!DOCTYPE html> <html lang ...

  5. 一道百度前端线上笔试题

    要求: 输入两个字符串   strA   长度 1-50 只能包含 0或者1   strB   长度 1-5   可以包含 0或1或? (? 代表    0  或者 1) 例如: strA = '10 ...

  6. coderwhy - WEB前端线上系统课全程直播课

    链接: https://pan.baidu.com/s/1d6YONkCi4u7T1ZBm1yZLYg 提取码: iamh 作者-\/ 307570512 前端性能优化建议 性能优化是把双刃剑,有好的 ...

  7. Go Web生成马赛克图片(1): 单机版

    马赛克: 对图片进行mosaic处理,就是说讲图片分割成多个通常是大小相同的矩形截面,然后使用被称为瓷砖图片的新图片区代替截面原有的图片. 所以,马赛克图片让我们在足够远的地方观察或者以斜视的角度观察 ...

  8. [ASP.NET2.0] asp.net在ie7中使用FileUpload上传前预览图片 [ZT]

    asp.net在ie7中使用FileUpload上传前预览图片 因为安全性问题,IE7禁用了image控件引用本地图片,为了这个问题郁闷了好几天,终于找到了解决方案,好东西要与大家分享,代码如下: 此 ...

  9. 马赛克(蒙太奇)图片生成--Python实现

    马赛克(蒙太奇)图片生成 观察上面一张图我们可以发现,图片大致为一个蒙娜丽莎的画像,但是又有些不太一样.图片由一个个块组成,每一个块都是一张另外的图片,那么要实现这样的效果,我们应该怎样做呢?用一句话 ...

最新文章

  1. 再造人类生命的神奇细胞Human.Life.Our.Amazing.Cell
  2. Bitcoin.com推出BCH新图表,加大对BCH的支持
  3. CSDN博文中完美地去掉图片水印、调整图片位置和大小
  4. ASP.NET Core 2.0 配置NLog日志组件
  5. 【原】web服务器占有量统计等 web网站
  6. POJ 3471 Integral Roots(素数、因数)
  7. Struts2-2.了解struts.xmlpackageactionresult的name属性
  8. HTTP状态码:415
  9. c++十六进制加法_16进制数之间的加法
  10. Window安装Redis并设置为开机启动
  11. java中jlaber用法_laber的for属性
  12. 云上故事 | “电”亮数字生活,阿里云混合云助力南方电网智能调度
  13. Phantomjs对vue进行seo优化
  14. 镜像方式如何部署项目
  15. 物联网卡助力智能城市打造智慧生活
  16. 二阶线性微分器的实现
  17. 分布式事务之——两段式、三段式
  18. 七种方法,教你培养持续学习的习惯
  19. 2023湖北大学计算机考研信息汇总
  20. 飞书文档导出pdf不带书签/大纲 问题

热门文章

  1. 打造Kali Linux+WinPE+文件储存 多系统启动自定义U盘
  2. 使你成为高手 HTC手机指令大全全覆盖
  3. Centos7 Redis 设置密码
  4. 反转链表之分步骤比喻
  5. CentOS安装配置Java环境
  6. java发送手机验证码实现
  7. 77个优美句子+漂亮翻译
  8. 从《男生传递微笑给女生的故事》想到的流程梳理与优化
  9. 电脑总是自动弹出outlook Express 窗口
  10. APP性能测试,你需要关注哪些指标?