不借助 Javascript,如何利用 SVG 實(shí)現(xiàn)圖片馬賽克效果?下面本篇文章就來(lái)帶大家詳細(xì)了解一下,希望對(duì)大家有所幫助!
之前在公眾號(hào)轉(zhuǎn)發(fā)了好友 Vajoy
的一篇文章 -- 巧用 CSS 把圖片馬賽克風(fēng)格化。
核心是利用了 CSS 中一個(gè)很有意思的屬性 -- image-rendering,它可以用于設(shè)置圖像縮放算法?!就扑]學(xué)習(xí):css視頻教程】
何為 image-rendering?
CSS 屬性 image-rendering 用于設(shè)置圖像縮放算法。它適用于元素本身,適用于元素其他屬性中的圖像,也應(yīng)用于子元素。
語(yǔ)法比較簡(jiǎn)單:
{ ????image-rendering:?auto;??????????????//?默認(rèn)值,使用雙線性(bilinear)算法進(jìn)行重新采樣(高質(zhì)量) ????image-rendering:?smooth;?????????//?使用能最大化圖像客觀觀感的算法來(lái)縮放圖像。讓照片更“平滑” ????image-rendering:?crisp-edges;??//?使用可有效保留對(duì)比度和圖像中的邊緣的算法來(lái)對(duì)圖像進(jìn)行縮放 ????image-rendering:?pixelated;??????//?放大圖像時(shí),?使用最近鄰居算法,因此,圖像看著像是由大塊像素組成的 }
其中,image-rendering: pixelated
比較有意思,可以將一張低精度圖像馬賽克化。
譬如,假設(shè)我們有一張 300px x 300px
的圖像,我們讓他轉(zhuǎn)換成 30px x 30px
:
我們?cè)侔咽д婧蟮膱D片,放大到 300px x 300px
:
在此基礎(chǔ)上,我們給這張圖片設(shè)置 image-rendering: pixelated
,就能得到一張被馬賽克化圖片:
<img src="pic.jpeg?30x30" />
img?{ ????width:?300px; ????height:?300px; ????image-rendering:?pixelated }
<strong>image-rendering: pixelated</strong>
實(shí)現(xiàn)馬賽克效果的局限性
OK,那么為什么需要先縮小再放大,然后才運(yùn)用 image-rendering: pixelated
呢?我們來(lái)做個(gè)對(duì)比,直接給原圖設(shè)置 image-rendering: pixelated
:
直接給原圖設(shè)置 image-rendering: pixelated
只會(huì)讓圖片變得更加有鋸齒感,而不會(huì)直接產(chǎn)生馬賽克的效果。
這也和 image-rendering: pixelated
的描述吻合,放大圖像時(shí), 使用最近鄰居算法,因此,圖像看著像是由大塊像素組成的。
我們只有基于放大模糊后的圖像,才能利用 image-rendering: pixelated
得到一張被馬賽克的圖片!
利用 CSS 再圖片縮小后再放大?
那么,假設(shè)我們只有一張清晰的原圖,又想利用 CSS 得到一個(gè)馬賽克效果,可行么?順著這個(gè)思路,我們可以想到:
能否利用 CSS 將圖片縮小后再放大,再運(yùn)用 image-rendering: pixelated
呢?
不行。WEB 上的圖片像極了 Photoshop 里的智能對(duì)象 —— 你可以任意修改它的尺寸(例如放大很多倍讓其變模糊),但最后再把圖片改回原本的大小時(shí),圖片會(huì)變回原來(lái)的樣子(沒(méi)有任何失真)。
所以,要想在只有一張?jiān)瓐D的情況下,得到一張模糊的圖像,就不得不求助于 Canvas,這樣一來(lái)就稍顯麻煩了。我們只是想要個(gè)馬賽克效果而已。
SVG 濾鏡疊加實(shí)現(xiàn)馬賽克效果
這就可以引出今天的主角了,SVG 濾鏡,使用幾層 SVG 濾鏡的疊加,其實(shí)可以非常輕松的實(shí)現(xiàn)一個(gè)馬賽克效果濾鏡。
并且,SVG 濾鏡可以通過(guò) CSS filter,輕松的引入。
代碼其實(shí)也非常的簡(jiǎn)單,SVG 定義一個(gè)濾鏡,利用多層濾鏡的疊加效果實(shí)現(xiàn)一個(gè)馬賽克效果,然后,通過(guò) CSS filter 引入,可以運(yùn)用在任何元素上:
<img src="任意無(wú)需縮放的原圖.png" alt=""> <svg> ??<filter id="pixelate" x="0" y="0"> ????<feFlood x="4" y="4" height="2" width="2"/> ????<feComposite width="8" height="8"/> ????<feTile result="a"/> ????<feComposite in="SourceGraphic" in2="a" operator="in"/> ????<feMorphology operator="dilate"radius="5"/> ??</filter> </svg>
img?{ ????width:?300px; ????height:?300px; ????filter:?url(#pixelate); }
這樣,我們就得到了一個(gè)馬賽克效果:
如果你只是想使用這個(gè)效果,你甚至不需要去理解整個(gè) SVG <filter>
到底做了什么事情,當(dāng)然,如果你是一個(gè)一問(wèn)到底的人,那么需要有一定的 SVG 基礎(chǔ),建議可以看看我的這幾篇關(guān)于 SVG 濾鏡的介紹:
CSS/SVG 實(shí)現(xiàn)馬賽克的局限性
當(dāng)然,CSS/SVG 濾鏡實(shí)現(xiàn)馬賽克的局限性在于,如果你是不想給用戶看到原圖的,那么在客戶端直接使用這個(gè)方式相當(dāng)于直接把原圖的暴露了。
因?yàn)?CSS/SVG 濾鏡的方式是在前端進(jìn)行圖片馬賽克化的,而且需要原圖。
當(dāng)然,利用上述的兩個(gè)實(shí)現(xiàn)圖片馬賽克技巧,我們還是可以用于制作一些簡(jiǎn)單的交互效果的,像是這樣:
上述的 DEMO 和 SVG 濾鏡的全部代碼,你都可以在這兩個(gè) DEMO 中找到:
原文地址:https://www.cnblogs.com/coco1s/p/16134088.html
作者:ChokCoco
(學(xué)習(xí)視頻分享:web前端)
以上是聊聊如何利用 SVG 實(shí)現(xiàn)圖片馬賽克效果的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)代碼編輯軟件(SublimeText3)

不借助 Javascript,如何利用 SVG 實(shí)現(xiàn)圖片馬賽克效果?下面本篇文章就來(lái)帶大家詳細(xì)了解一下,希望對(duì)大家有所幫助!

svg圖片在項(xiàng)目中使用的非常廣泛,下面本篇文章帶大家介紹一下如何在vue3 vite 中使用svg圖標(biāo),希望對(duì)大家有所幫助!

svg可以通過(guò)使用圖像處理軟件、使用在線轉(zhuǎn)換工具和使用Python圖像處理庫(kù)的方法來(lái)轉(zhuǎn)jpg格式。詳細(xì)介紹:1、圖像處理軟件包括Adobe Illustrator、Inkscape和GIMP;2、在線轉(zhuǎn)換工具包括CloudConvert、Zamzar、Online Convert等;3、Python圖像處理庫(kù)等等。

隨著現(xiàn)代Web前端開(kāi)發(fā)的不斷發(fā)展,越來(lái)越多的技術(shù)被廣泛應(yīng)用于實(shí)際開(kāi)發(fā)中。其中,Vue.js是目前最為流行的JavaScript框架之一,它基于MVVM模式,提供了豐富的API和組件庫(kù),使得開(kāi)發(fā)響應(yīng)式、可復(fù)用、高效的Web應(yīng)用變得更加容易。而目前最新的Vue.js3版本相較于舊版,又有著更好的性能和更豐富的特性,引起了廣泛的關(guān)注和研究。本文將會(huì)為大家介紹一種

怎么使用SVG給 favicon 添加標(biāo)識(shí)?下面本篇文章給大家介紹一下使用 SVG 生成帶標(biāo)識(shí)的 favicon的方法,希望對(duì)大家有所幫助!

一、安裝vite-plugin-svg-icons此處還需要安裝下fast-glob相關(guān)依賴,不然vite運(yùn)行npmrundev時(shí)會(huì)報(bào)Cannotfindmodule'fast-glob’的錯(cuò)誤npmifast-glob@3.x-Dnpmivite-plugin-svg-icons@2.x-D二、在src/components/svgIcon下新建組件index.vueimport{computed}from'vue';cons

一、安裝svg-sprite-loadernpminstallsvg-sprite-loader--save-dev二、在src/components/svgIcon下新建組件index.vueimport{computed}from"@vue/reactivity";exportdefault{name:"baseSvgIcon",props:{iconClass:{type:String},className:{type:String},},setup

要在畫(huà)布元素上繪制HTMLImageElements,請(qǐng)使用drawImage()方法。此方法使用src=”mySVG.svg”定義一個(gè)Image變量,并在加載時(shí)使用drawImage。varmyImg=newImage();myImg.onload=function(){??ctx.drawImage(myImg,0,0);}img.src="http://www.example.com/files/sample.svg";
