<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何把愛心圖片變成“偽像素風”?用 CSS 賊容易!

          共 3601字,需瀏覽 8分鐘

           ·

          2021-12-17 02:43

          點擊上方 前端瓶子君,關注公眾號

          回復算法,加入前端編程面試算法每日一題群

          產品小妹妹對同事阿洋說:“如果你能用CSS把一張愛心圖片變成像素風,我今天就答應跟你約會?!?/p>

          我拍了拍阿洋的肩膀,意味深長地說:“放心,學長會幫你的。”

          什么是像素風?

          像素風是一種以固定大小純色像素方塊作為基本單元,進行創(chuàng)作,包含但不限于繪畫建筑、游戲更各個領域的一種美術風格。
          其中最讓人耳熟能詳的,當然是早期電子游戲的像素畫面啦~


          [早期紅白機上"馬里奧"的像素形象]
          當然,早期電子游戲采用像素風,實際上是一種歷史的無奈,硬件條件的限制,讓游戲開發(fā)者不得不選擇這種變現力強,性能開銷低的美術風格。

          不過,時至今日像素風在各個領域依然潮流,則被賦予了更多審美復古上的意義。

          思路分析

          先看看本次要處理的“愛心圖”的原圖:


          [愛心圖]

          要將一張這樣的圖片變成像素,我腦海里首先蹦出了第一個思路:

          思路一:通過canvas切割和填充

          使用canvas將圖片切割成N*N塊,然后每塊區(qū)域單獨計算取色彩中值,并將其填充為實色,沒錯,這個思路無疑是可以很快且靈活的解決問題的。
          但這樣一來,沒使用到CSS,同事阿洋的第一次約會豈不是就完全泡湯了?
          ??
          不行不行!我得換個思路,用CSS來實現!

          思路二:大半徑高斯模糊濾鏡來取中值

          主體思路如下:

          1. 將圖片分成N個div,每個div都持有圖片的一部分。
          2. 每個div都通過css-filter來進行一次blur(高斯模糊),視覺上達到取中值并填充div的效果。

          按這個思路,其實只有一個難點,如何讓每個div都持有圖片的一部分?

          呵,這可難不倒我那顆幫助同事大心臟。

          實施

          其實不難:

          1. 首先,我們用8*8將一個div分成64份,毫無疑問的grid布局。


          代碼:

          <style>
              .mask-group {
                width128px;
                height128px;
                display: grid;
                grid-template-columnsrepeat(8,1fr);
                grid-template-rowsrepeat(8,1fr);
              }
          </style>

          <script>
            const el = document.querySelector('.mask-group')
              for(let i = 0; i< 64; i++) {
                const itemEl = document.createElement('div')
                itemEl.className = 'mask-item'
                el.appendChild(itemEl)
              }
            }
          </script>

          復制代碼
          1. 然后我們給每個.mask-item 元素設置一個心形背景

          然后效果就變成了這樣,因為每一張的背景都是從左上角開始的,因此肯定不符合預期。


          接下來:我們需要在js的遍歷中插入這么一句:

          itemEl.style.backgroundPosition = `-${Math.floor(i%8) * 16}px -${Math.floor(i/8) * 16}px `
          復制代碼

          這行代碼的作用,是給每一個.mask-item元素單獨賦予一個background-position樣式,通過計算讓所有.mask-item元素的背景圖的左上角都重疊到了一個坐標點上
          效果如圖:


          3. 增加間隔和高斯模糊 按照設想,我們只需要給div加上間隔,再給上高斯模糊,就能達到效果了。于是代碼如下:

          .mask-group {
            /* 以下為新增 */
            grid-row-gap2px;
            grid-column-gap2px;
          }
          .mask-item {
            /* 以下為新增 */
            filterblur(8px)
          }
          復制代碼

          但是效果卻:

          step4.png

          到底是哪里出了問題?
          高斯模糊居然會作用到inner-box以外的區(qū)域??!

          1. mask-image 限定可視區(qū)域

          沒辦法,為了限定高斯模糊的效果區(qū)域,我只能通過mask-image了。
          先弄一張16*16像素的純黑all-black.png文件。
          代碼如下:

          .mask-item {
            /* 以下為新增 */
            -webkit-mask-imageurl('./all-black.png');
            mask-imageurl('./all-black.png');  
          }
          復制代碼

          效果圖:

          px.png

          嘿嘿,現在就像那么回事了,不過因為被高斯的原因,顏色淡了不少,沒事,微調一下即可。

          1. 調整顏色

          代碼如下:

          .mask-item {
            /* 以下為更改 */
            filterblur(8pxcontrast(400%saturate(400%);
          }
          復制代碼


          大功告成??!

          故事結局

          萬萬沒想到,同事阿洋還是沒能完成和產品妹妹小美的約會。
          原因居然是:
          產品妹妹覺得我寫代碼的樣子過于靚仔,非要和我約會!


          --全劇終--


          關于本文

          來源:春哥的夢想是摸魚

          https://juejin.cn/post/7034010492830121991


          最后

          歡迎關注【前端瓶子君】??ヽ(°▽°)ノ?
          回復「算法」,加入前端編程源碼算法群,每日一道面試題(工作日),第二天瓶子君都會很認真的解答喲!
          回復「交流」,吹吹水、聊聊技術、吐吐槽!
          回復「閱讀」,每日刷刷高質量好文!
          如果這篇文章對你有幫助,在看」是最大的支持
           》》面試官也在看的算法資料《《
          “在看和轉發(fā)”就是最大的支持
          瀏覽 54
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  A片视频在线大全 | 77777亚洲和欧洲视频在线观看 | 91色色色| 六月天婷婷 | 成人性生活免费视频 |