好程式設計師web前端分享用CSS和JS打造一個簡單的圖片編輯器

好程式設計師IT發表於2019-05-20

   本文主要是利用 CSS的 filter和簡單的Jquery程式碼來實現一個簡單的圖片編輯器,包括對圖片的透明度,黑白,圖片亮度等調節。


  CSS filter


  我們首先來探討一下 filter。


  首先來說明一下 filter,在CSS裡面要實現filter,其實很簡單,使用類似下面的宣告方式:
  

1.  <font size="3">.example {</font>

2.  <font size="3">  filter: [];</font>

3.  <font size="3">  }</font>


  

              <font size="3">比如說,我們給圖片新增一點灰度(grayscale)特效,就可以這樣:</font>

1.  <font size="3">  .example {</font>

2.  <font size="3">  filter: grayscale(90%);</font>

3.  <font size="3">  }</font>


  當然,為了瀏覽器相容,我們最好這樣寫:

1.  <font size="3">.example {</font>

2.  <font size="3">  -webkit-filter: grayscale(90%);</font>

3.  <font size="3">  filter: grayscale(90%);</font>

4.  <font size="3">  }</font>


  需要注意的是: filter的屬性值的單位通常可能是從0到1之間,但是有些不是這樣的,比如blur是使用畫素'px'來作為單位的,而hue-rotate則使用角度deg來作為基本單位;

1.  <font size="3"> .example {</font>

2.  <font size="3">  filter: blur(10px);</font>

3.  <font size="3">  }</font>

4.  <font size="3">  .example-2 {</font>

5.  <font size="3">  filter: hue-rotate(90deg);</font>

6.  <font size="3">  }</font>


  但是如果每次只能使用一個 filter就比較麻煩了,所以CSS提供了更加方便的書寫形式,直接並排著寫:

1.  <font size="3"> .example {</font>

2.  <font size="3">  filter: grayscale(0.5) blur(10px);</font>

3.  <font size="3">  }</font>


  這樣就可以實現對一個元素新增多個 filter屬性。


  簡單地說完 filter之後,我們來動手建立一個簡單的圖片編輯器。


  建立基本的 HTML檔案


  在這裡我們建立一個 index.html,程式碼也比較簡單:

1.  <font size="3"> Image Editor</font>

2.  <font size="3">  Grayscale</font>

3.  <font size="3">  Blur</font>

4.  <font size="3">  Brightness</font>

5.  <font size="3">  Contrast</font>

6.  <font size="3">  Hue Rotate</font>

7.  <font size="3">  Opacity</font>

8.  <font size="3">  Invert</font>

9.  <font size="3">  Saturate</font>

10.  <font size="3">  Sepia</font>


  這個檔案裡,我們引入了 main.css和main.js,main.css其實是對編輯器的一些排版起的作用,並沒有對圖片的filter效果做出實際的影響,我們做的是編輯器,所以在使用者改變某個filter的值的時候,我們可以實時讓使用者看到效果,於是這些實現filter的程式碼應該就放在main.js裡面。


  上面的每一個


  下面的


  元素下面的 input都是filter的一個屬性設定,因為我們可以同時用多個filter來對圖片產生特效,所以我每個filter的屬性值都設定為可以調節的狀態。


  上面的 index.html還要說明的是,在最上面我們提供一個輸入框,用於給使用者輸入圖片的URL,當使用者點選回車的時候,我們就將這張圖片顯示到編輯區域。使用的是下面的簡單js程式碼:

1.  <font size="3"> function addImage(e) {</font>

2.  <font size="3">  var imgUrl = $("#imgUrl").val();</font>

3.  <font size="3">  if (imgUrl.length) {</font>

4.  <font size="3">  $("#imageContainer img").attr("src", imgUrl);</font>

5.  <font size="3">  }</font>

6.  <font size="3">  e.preventDefault();</font>

7.  <font size="3">  }</font>

8.  <font size="3">  //on pressing return, addImage() will be called</font>

9.  <font size="3">  $("#urlBox").submit(addImage);</font>


  上面的 js程式碼也是寫到main.js當中。有了可以使用者自己新增圖片之後,我們就可以實現對圖片的編輯了:


  每次使用者在滑動進度條的時候,我們就可以將效果展示給使用者看,於是我們來監聽使用者的 mousemove事件:

1.   $("input[type=range]").mousemove(editImage);


  也就是說,每次使用者在移動控制條的時候,我們都執行 editImage函式。


  但是這樣的體驗可能還不是最好,因為在最後使用者的滑鼠離開控制條的時候,我們還可以監聽 change事件,把這一刻的變化也交給editImage函式處理,所以可以將上面的程式碼寫成這樣:

1.  font size="3">$("input[type=range]").mousemove(editImage).change(editImage);</font>

2.  <font size="3">  複製程式碼編寫editImage函式</font>

3.  <font size="3">  上面我們將input[type=range]的mousemove和change事件交給了editImage函式處理,所以,我們來編寫一下editImage的函式程式碼:</font>

4.  <font size="3">  function editImage() {</font>

5.  <font size="3">  var gs = $("#gs").val(); // grayscale</font>

6.  <font size="3">  var blur = $("#blur").val(); // blur</font>

7.  <font size="3">  var br = $("#br").val(); // brightness</font>

8.  <font size="3">  var ct = $("#ct").val(); // contrast</font>

9.  <font size="3">  var huer = $("#huer").val(); //hue-rotate</font>

10.  <font size="3">  var opacity = $("#opacity").val(); //opacity</font>

11.  <font size="3">  var invert = $("#invert").val(); //invert</font>

12.  <font size="3">  var saturate = $("#saturate").val(); //saturate</font>

13.  <font size="3">  var sepia = $("#sepia").val(); //sepia</font>

14.  <font size="3">  $("#imageContainer img").css("filter", 'grayscale(' + gs+</font>

15.  <font size="3">  '%) blur(' + blur +</font>

16.  <font size="3">  'px) brightness(' + br +</font>

17.  <font size="3">  '%) contrast(' + ct +</font>

18.  <font size="3">  '%) hue-rotate(' + huer +</font>

19.  <font size="3">  'deg) opacity(' + opacity +</font>

20.  <font size="3">  '%) invert(' + invert +</font>

21.  <font size="3">  '%) saturate(' + saturate +</font>

22.  <font size="3">  '%) sepia(' + sepia + '%)');</font>

23.  <font size="3">  $("#imageContainer img").css("-webkit-filter", 'grayscale(' + gs+</font>

24.  <font size="3">  '%) blur(' + blur +</font>

25.  <font size="3">  'px) brightness(' + br +</font>

26.  <font size="3">  '%) contrast(' + ct +</font>

27.  <font size="3">  '%) hue-rotate(' + huer +</font>

28.  <font size="3">  'deg) opacity(' + opacity +</font>

29.  <font size="3">  '%) invert(' + invert +</font>

30.  <font size="3">  '%) saturate(' + saturate +</font>

31.  <font size="3">  '%) sepia(' + sepia + '%)');</font>

32.  <font size="3">  }</font>


  其實很簡單,我們在每次使用者滑動控制條的時候,我們就透過類似 var gs = $("#gs").val();的語句取得相對應地值,然後透過Jquery的css()方法直接為圖片加上filter效果,而且相信你也看得出來,這個函式的後半段就是實現瀏覽器相容的

1.  <font size="3"> $("#imageContainer img").css("-webkit-filter",...)</font>

2.  <font size="3">  複製程式碼</font>

3.  <font size="3">  這段程式碼其實就是在img元素實現了類似下面的效果;</font>

4.  <font size="3">  </font>

5.  <font size="3">[img=28,30][/img]</font>


  最後,如果你不想將某些特效加到圖片上面去,你可以點 reset然後將圖片重置到原始狀態:

1.  <font size="3">

2.    $('#imageEditor').on('reset', function () {</font>

3.  <font size="3">  setTimeout(function() {</font>

4.  <font size="3">  editImage();</font>

5.  <font size="3">  },0);</font>

6.  <font size="3">  });</font>


  這裡需要說明一下的是,這裡的 setTimeout函式就是為了將reset的效果最快地展現出來,如果寫成下面的形式:

1.  <font size="3">$('#imageEditor').on('reset', function () {</font>

2.  <font size="3">  editImage();</font>

3.  <font size="3">  });</font>

 


  這個時候, reset效果執行起來其實是有一點延遲的,你明顯可以看到等待的時候,它並不是很快。


  瀏覽器開啟 index.html,就可以看到相應的調節效果了。你可以拖動一些設定項的控制條來檢視效果。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2641841/,如需轉載,請註明出處,否則將追究法律責任。

相關文章