本章给大家介绍html5如何利用canvas实现图片转素描效果。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

素描滤镜原理:

最基础的算法就是:

1、去色;(去色公式:gray = 0.3 red + 0.59 green + 0.11 * blue)

2、复制去色图层,并且反色;

3、对反色图像进行高斯模糊;

4、模糊后的图像叠加模式选择颜色减淡效果。

减淡公式:C =MIN( A +(A×B)/(255-B),255),其中C为混合结果,A为去色后的像素点,B为高斯模糊后的像素点。

先看看效果对比图:

sigma可以调节效果。

代码实例:

sigma:0.8

下载

var eleImg = document.getElementById("imgs");

var eleRadius = document.getElementById("range_radius");

var eleSigma = document.getElementById("range_sigma");

var valueRadius = document.getElementById("value_radius");

var valueSigma = document.getElementById("value_sigma");

var svaeHref = document.getElementById("save_href");

var imgSrc = "img/2.jpg";

var radius = 1;

var sigma = 0.8;

eleImg.addEventListener("input",function (e) {

var fileObj = e.currentTarget.files[0]

if (window.FileReader) {

var reader = new FileReader();

reader.readAsDataURL(fileObj);

//监听文件读取结束后事件

reader.onloadend = function (e) {

imgSrc = e.target.result; //e.target.result就是最后的路径地址

sketch()

};

}

});

var butSave = document.getElementById("save");

function changeRadius() {

valueRadius.innerText = eleRadius.value/10;

radius = eleRadius.value/10;

sketch()

}

function changeSigma() {

valueSigma.innerText = eleSigma.value/50;

sigma = eleSigma.value/50;

sketch()

}

var canvas1 = document.querySelector("#canvas1");

var cxt1 = canvas1.getContext("2d");

var canvas = document.querySelector("#canvas2");

var cxt = canvas.getContext("2d");

function sketch() {

cxt1.clearRect(0,0,canvas1.width,canvas1.height);

cxt.clearRect(0,0,canvas.width,canvas.height);

var img = new Image();

img.src = imgSrc;

img.onload = function () {

canvas1.width = 600;

canvas1.height = (img.height/img.width)*600;

cxt1.drawImage(img, 0, 0, canvas1.width, canvas1.height);

canvas.width = 600;

canvas.height = (img.height/img.width)*600;

cxt.drawImage(img, 0, 0, canvas.width, canvas.height);

var imageData = cxt.getImageData(0, 0, canvas.width, canvas.height); //对于 ImageData 对象中的每个像素,都存在着四方面的信息,即 RGBA 值

var imageData_length = imageData.data.length/4;

// var originData = JSON.parse(JSON.stringify(imageData))

// 解析之后进行算法运算

var originData = [];

for (var i = 0; i < imageData_length; i++) {

var red = imageData.data[i*4];

var green = imageData.data[i*4 + 1];

var blue = imageData.data[i*4 + 2];

var gray = 0.3 * red + 0.59 * green + 0.11 * blue;//去色

originData.push(gray)

originData.push(gray)

originData.push(gray)

originData.push(imageData.data[i * 4 + 3])

var anti_data = 255 - gray;//取反

imageData.data[i * 4] = anti_data;

imageData.data[i * 4 + 1] = anti_data;

imageData.data[i * 4 + 2] = anti_data;

}

imageData = gaussBlur(imageData, radius, sigma)//高斯模糊

for (var i = 0; i < imageData_length; i++) {

var dodge_data = Math.min((originData[i*4] + (originData[i*4]*imageData.data[i * 4])/(255-imageData.data[i * 4])), 255)//减淡

imageData.data[i * 4] = dodge_data;

imageData.data[i * 4 + 1] = dodge_data;

imageData.data[i * 4 + 2] = dodge_data;

}

console.log(imageData)

cxt.putImageData(imageData, 0, 0);

var tempSrc = canvas.toDataURL("image/png");

svaeHref.href=tempSrc;

}

}

sketch()

function gaussBlur(imgData, radius, sigma) {

var pixes = imgData.data,

width = imgData.width,

height = imgData.height;

radius = radius || 5;

sigma = sigma || radius / 3;

var gaussEdge = radius * 2 + 1; // 高斯矩阵的边长

var gaussMatrix = [],

gaussSum = 0,

a = 1 / (2 * sigma * sigma * Math.PI),

b = -a * Math.PI;

for (var i=-radius; i<=radius; i++) {

for (var j=-radius; j<=radius; j++) {

var gxy = a * Math.exp((i * i + j * j) * b);

gaussMatrix.push(gxy);

gaussSum += gxy; // 得到高斯矩阵的和,用来归一化

}

}

var gaussNum = (radius + 1) * (radius + 1);

for (var i=0; i

gaussMatrix[i] = gaussMatrix[i] / gaussSum; // 除gaussSum是归一化

}

//console.log(gaussMatrix);

// 循环计算整个图像每个像素高斯处理之后的值

for (var x=0; x

for (var y=0; y

var r = 0,

g = 0,

b = 0;

//console.log(1);

// 计算每个点的高斯处理之后的值

for (var i=-radius; i<=radius; i++) {

// 处理边缘

var m = handleEdge(i, x, width);

for (var j=-radius; j<=radius; j++) {

// 处理边缘

var mm = handleEdge(j, y, height);

var currentPixId = (mm * width + m) * 4;

var jj = j + radius;

var ii = i + radius;

r += pixes[currentPixId] * gaussMatrix[jj * gaussEdge + ii];

g += pixes[currentPixId + 1] * gaussMatrix[jj * gaussEdge + ii];

b += pixes[currentPixId + 2] * gaussMatrix[jj * gaussEdge + ii];

}

}

var pixId = (y * width + x) * 4;

pixes[pixId] = ~~r;

pixes[pixId + 1] = ~~g;

pixes[pixId + 2] = ~~b;

}

}

imgData.data = pixes;

return imgData;

}

function handleEdge(i, x, w) {

var m = x + i;

if (m < 0) {

m = -m;

} else if (m >= w) {

m = w + i - x;

}

return m;

}

上面就是canvas实现图片转素描效果的全部代码,大家可以自己动手编译调试。

php图片素描化,html5利用canvas实现图片转素描效果相关推荐

  1. 在html利用canvas蚂蚁,html5 利用canvas实现简单的人物走动

    最近在学习html5,其中涉及到很关键的元素canvas-画布,在网上下载了一些游戏源代码,虽然能看懂,但是想单独地针对某个功能提取出来还是有难处的,于是乎自己又上网查找了一些例子,才将超级玛丽简单的 ...

  2. html5 自动扣图,html5利用canvas实现颜色容差抠图功能

    利用canvas的getImageData,我们可以获取到一张图片每一个像素的信息,而通过对每一个像素信息的对比,我们就可以找到需要消去的像素点.比如下面这一张图片,如果我们想要扣去白色部分(粉色是b ...

  3. 如何在ps中将图片素描化

    如何在photoshop中将图片素描化 作者:陈涛 写作时间:2019.1.17 其实 ,在Photoshop在将一张图片转变成素描图片非常的简单,接下来我就为大家讲解一下如何将图片素描化 首先,我们 ...

  4. ps小知识——将图片素描化

    ....... (PS小知识--将图片素描化) 步骤: 一:先复制背景图层 快捷键:Ctrl + J 二:点击"图像"-"调整"-"去色" ...

  5. 利用canvas下载图片,透明区默认变为黑色

    问题:利用canvas下载图片,透明区默认变为黑色 HTML <canvas id="canvas"></canvas> <div style=&qu ...

  6. win7小工具打不开_强大图片素描化工具 FotoSketcher 3.4

    软件介绍 FotoSketcher 是一款很简便且强大的图片素描化工具,处理速度很快,可以帮助你创建类似真实素描的艺术作品. 更新内容/软件特色 FotoSketcher 现在有二十多种自动素描方式, ...

  7. 3 - 图片灰度化与转换为八位灰度图片

    参考资料:彩色图像灰度化 图片灰度化与转换为八位灰度图片 1.灰度化公式 2.24 位真彩图灰度化 3.24 位真彩图转换成 8 位灰度图片 1.灰度化公式 彩色图像灰度化的算法公式一般有如下两种:明 ...

  8. js 利用canvas转换图片格式并下载图片

    1.利用canvas转换格式 思路很简单,就是在canvas上drawImage,然后再把canvas转换成想要的图片格式 convertImageToCanvas = (image) => { ...

  9. 利用canvas给图片添加水印

    前言 前两天给个人网站添加了一个小功能,就是在文章编辑上传图片的时候自动给图片加上水印.给网页图片添加水印是个常见的功能,也是互联网内容作者保护自己版权的方法之一.本文简单记录一下借助canvas在前 ...

最新文章

  1. Jürgen Schmidhuber眼中的深度学习十年,以及下一个十年展望
  2. Update item to this version和Revert to this version区别
  3. 漂亮的花样边框html代码,手把手教你制作精美边框素材HTML代码
  4. 向web服务器传文件,c++实现向web服务器上传文件
  5. linux系统安装显卡驱动卡顿,关于Ubuntu16.04上N卡驱动导致滚动屏幕卡顿问题
  6. iOS事件拦截(实现触摸任意位置隐藏指定view)
  7. 百面机器学习 #3 经典算法:02 逻辑回归
  8. python 入门基础-Python 如何入门?
  9. 32. iostat
  10. html简单个人网页制作网站设计——腾讯游戏官网(13页) HTML+CSS+JavaScript web网页设计与开发
  11. 初级学电脑计算机的入门知识,电脑基础知识入门学习(小白学好电脑从哪里开始)...
  12. 你需要启用steam社区界面功能以进行购买_打开了新世界的大门!Steam好评的实用工具/软件推荐...
  13. PushMall推贴共享电商十二月更新计划
  14. win10计算机系统慢,解决Win10电脑变慢的一些方法
  15. 反激电源电路电磁干扰原理
  16. Java使用PDFBox将多个PDF合并为单个PDF
  17. sql 闩锁 原因_如何识别和解决SQL Server中的热闩锁
  18. Java“菜单“树递归-合并子树
  19. Linux查看so文件信息
  20. 对手在开拓,苹果在“堕落”,创新路上,苹果还能走多远

热门文章

  1. jQuery设置按钮的属性_可用不可用
  2. F2FS源码分析系列文章目录
  3. 项目管理之信息文档管理与配置管理(第一篇)
  4. 银行家算法——C++实现 [ 开源代码 + 详细解析 ]
  5. java.io.FileNotFoundException异常的原因
  6. SAP笑话 ABAP简称
  7. 使用Apache2 搭建静态文件服务器
  8. Ubuntu18.04中如何更换为清华的镜像源
  9. 上手简单的专业麦克风,室内户外清晰录音,唯乐狗G3S体验
  10. 移民真的抢走了美国人的工作吗?