强大的CSS:滤镜和混合模式处理的图片如何上传下载?

一、使用CSS滤镜和混合模式在线PS

使用CSS滤镜和混合模式可以实现各种各样的图像处理效果,内置众多图像处理效果,部分效果示意如下缩略图:

进入demo页面你也可以点击这里的按钮,更换你本地的素材,查看对应的图像效果:

呈现的效果虽好,但是也带来另外一个问题,虽然视觉上是已经处理后的图片,但是如果我们右键-图片另存为,会发现还是原图。

如果用户觉得某个图片处理后的效果很棒,想要保存到自己的本机,就会受阻。

或者说,我们基于CSS滤镜和混合模式制作了一款图像处理的工具,最后需要把这些已经处理好的图片上传到后台,作为一个独立的<img>元素使用,也会受阻。

怎么办?难道我们要放弃这么好的特性,还使用canvas来处理图像吗?[图片上传失败...(image-9fb53e-1558444076034)]

不需要的,实际上是有方法可以得到CSS处理后的图像的。

二、SVG foreignObject元素与视觉存储

SVG中有个<foreignObject>元素,可以实现在SVG内部嵌入XHTML元素,例如:

// canvas转为blob并上传
canvas.toBlob(function (blob) {
    // 图片ajax上传
    var xhr = new XMLHttpRequest();
    // 文件上传成功
    xhr.onload = function() {
         // xhr.responseText就是返回的数据
    };
    // 开始上传
    xhr.open("POST", ‘upload.php‘, true);
    xhr.send(blob);
}, ‘image/jpeg‘);

而SVG本质上就是个图像,也就是说,我们只需要把图像处理相关的HTML代码和CSS代码放在&lt;foreignObject&gt;元素中,然后作为&lt;img&gt;图像呈现,然后再绘制到canvas画布上,这样就可以得到纯正的处理后的位图图像了。

demo页面最后一张图片和CSS处理后的图片长相虽同,但是本质却不同,一个还是原始图(试试右键-另存为),一个本质上是合成图(试试右键-另存为),如下截图示意:

于是,接下来,无论是是要下载到本机还是上传到服务器都不是问题。

关于上传,可以传输图像canvas.toDataURL()的base64数据,也可以传输canvas.toBlob()的Blob数据:

// canvas转为blob并上传
canvas.toBlob(function (blob) {
    // 图片ajax上传
    var xhr = new XMLHttpRequest();
    // 文件上传成功
    xhr.onload = function() {
         // xhr.responseText就是返回的数据
    };
    // 开始上传
    xhr.open("POST", ‘upload.php‘, true);
    xhr.send(blob);
}, ‘image/jpeg‘);

三、我该如何在项目中使用?

上面的demo页面中,我写了个名为c***enderImage2PureImage()的方法,可以把类似下面代码结构的CSS图像处理结果变成一张图片:

<div id="input" class="clarendon-filter">
    <img src="./example.jpg">
</div>
.clarendon-filter {
    filter: contrast(1.2) saturate(1.35);
    display: inline-block;
    position: relative;
}
.clarendon-filter::before {
    content: ‘‘;
    display: block;
    height: 100%;
    width: 100%;
    top: 0; left: 0;
    position: absolute;
    background: rgba(127,187,227,.2);
    mix-blend-mode: overlay;
    pointer-events: none;
}

c***enderImage2PureImage()方法语法:


c***enderImage2PureImage(dom, callback);

其中:

dom
必须参数。DOM对象。
callback
可选参数。Function。回调方法,支持一个参数,为合成后的图片的base64信息。
示例:

c***enderImage2PureImage(input, function (url) {
    // url就是合成后的图片base64地址
    // 你可以对url做你任何你想做的事情……
});

四、其它说明以及结束语

  1. c***enderImage2PureImage方法高度定制,如果你的CSS滤镜处理的DOM结构有所不同,你需要根据你的项目场景调整下c***enderImage2PureImage方法里面的代码;
  2. &lt;foreignObject&gt;元素是著名的html2canvas工具的核心,通常一些小的局部的截图功能,我们直接自己撸十几行代码处理下就好了,更高效更灵活。关于SVG的&lt;foreignObject&gt;元素,我之前专门写过一个文章介绍过:“SVG <foreignObject>简介与截图等应用”,想要深入了解实现原理的人可以看看。
  3. 此技术实现请在Chrome浏览器下玩耍。

本文所提供的解决方案和应用场景涉及到了CSS滤镜和混合模式,SVG?&lt;foreignObject&gt;元素,以及Canvas的图像绘制和处理技巧。幸好这3个领域是自己着重学习的领域,如果有哪一方面缺失,解决方案一定无法信手捏来。

我们究竟要学什么东西,不是看这个东西到底热不热门,而是要看跟你想感兴趣的领域是否相关,SVG和Canvas实际上属于小众领域,但都与图形表现密切相关,因此,义无反顾学习,而且学习的时候不要只学热门的API,一些不常用的特性,API也要面面俱到,例如SVG?&lt;foreignObject&gt;元素就是个很不常用的SVG元素,但在这里大放异彩,是技术实现的最关键部分。

自己是一个五年的前端工程师,希望本文对你有帮助!

这里推荐一下我的前端学习交流扣qun:731771211 ,里面都是学习前端的,如果你想制作酷炫的网页,想学习编程。自己整理了一份2019最全面前端学习资料,从最基础的HTML+CSS+JS【炫酷特效,游戏,插件封装,设计模式】到移动端HTML5的项目实战的学习资料都有整理,送给每一位前端小伙伴,每天分享技术

点击:加入

原文地址:https://blog.51cto.com/14284898/2398716

时间: 2024-08-03 20:28:09

强大的CSS:滤镜和混合模式处理的图片如何上传下载?的相关文章

用Canvas+Javascript FileAPI 实现一个跨平台的图片剪切、滤镜处理、上传下载工具(转)

直接上代码,其中上传功能需要自己配置允许跨域的文件服务器地址~ 或者将html文件贴到您的站点下同源上传也OK. 支持: 不同尺寸图片获取. 原图缩小放大. 原图移动. 选择框大小改变. 下载选中的区域. 上传选中的区域. 几种简单的滤镜(自己添加滤镜函数即可添加滤镜效果) 移动端适配要点: ① 替换事件名称 if(/^.*(Android|iPad|iPhone){1}.*$/.test(navigator.userAgent)){ eventName={down:"touchstart&qu

用Canvas+Javascript FileAPI 实现一个图片剪切、滤镜处理、上传下载工具

直接上代码,其中上传功能需要自己配置允许跨域的文件服务器地址~ 或者将html文件贴到您的站点下同源上传也OK. 支持: 不同尺寸图片获取. 原图缩小放大. 原图移动. 选择框大小改变. 下载选中的区域. 上传选中的区域. 几种简单的滤镜(自己添加滤镜函数即可添加滤镜效果) <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dt

利用Js或Css滤镜实现IE6中PNG图片半透明效果 IE6PNG妥妥的

接下来介绍几种PNG图片在IE6中不透明的解决办法 1.用自己的PNG,让IE6一边去吧 首先制作PNG图片的时候,另存为一个GIF图片,因为IE6是支持GIF图片透明,然后在css定义 .pngtest{ background:url(mark.png); _background:url(mark.gif);} 优点:方便.快捷,使用超简单 缺点:对于PNG图片只是某些局域透明,该方法比较奏效,但图片要是半透明的话,这种方法就实现不了 该方法延伸的另外一种解决办法:用PS或者其他图片编辑工具把

css input[type=file] 样式美化,input上传按钮美化

我们在做input文本上传的时候,html自带的上传按钮比较丑,如何对其进行美化呢?同理:input checkbox美化,input radio美化是一个道理的,后面文章会总结. 思路: input file上传按钮的美化思路是,先把之前的按钮透明度opacity设置为0,然后,外层用div包裹,就实现了美化功能. 代码如下: DOM结构: <a href="javascript:;" class="a-upload"> <input type=

CSS:点击图片区域上传文件

前端菜鸟,本人目前只能看懂和抄代码.因为参与一个项目需要用到这块样式,于是在网上找到的例子.于是记下来,同时也是方便自己查阅. /*定义图像以及大小*/ .imageFileInput{ width: 200px; height: 200px; position: absolute; background-color: red; /*这里可以换成图片路径(background-image:../img/....)注意图片路径*/ } /*定义上传*/ .fileInput{ height: 10

使用强大的 CSS 滤镜实现安卓充电动画效果

用安卓手机的同学肯定不陌生,这个是安卓手机在充电的时候的效果.看到这个我就很好奇,使用 CSS 能做到吗? 经过一番尝试,发现使用 CSS 也是可以很好的模拟这种动画效果: 知识点 拆解一下知识点,最主要的其实是用到了 filter: contrast() 以及 filter: blur() 这两个滤镜,可以很好的实现这种融合效果. 单独将两个滤镜拿出来,它们的作用分别是: filter: blur(): 给图像设置高斯模糊效果. filter: contrast(): 调整图像的对比度. 但是

CSS滤镜

使用滤镜,可以进行下对元素进行透明化的修饰. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht

CSS滤镜之Blur滤镜——模糊

Blur滤镜比较类似于ps里面的运动模糊效果. 语法: {FILTER:blur(add=add,direction=direction,strength=strength)} “ADD”参数是一个布尔判断“TRUE(默认)”或者“FALSE”.它指定图片是否被改变成印象派的模糊效果.模糊效果是按顺时针的方向进行的, “DIRECTION”参数用来设置模糊的方向.其中0度代表垂直向上,然后每45度为一个单位.它的默认值是向左的270度. “STRENGTH“值只能使用整数来指定,她代表有多少像素

Material UI:非常强大的CSS框架

Material UI 是一款功能非常强大,界面却十分清新简洁的CSS框架,Material UI利用了Google的Material Design 全新设计语言,并且让每一个UI组件都变得非常独立,因此开发者使用Material UI也会比较简单.和Bootstrap类似,Material UI提供了很多常用的UI组件,除了最基本的菜单.按钮.滑动杆.进度条.单选框/复选框外,它还提供了一个非常有趣的日历组件,另外还提供了一些很有趣的图标. Material UI 的特点 组件很丰富,每一个组