您當(dāng)前位置:圖趣網(wǎng)(Tuquu) >> 網(wǎng)頁設(shè)計教程 >> 移動前端 >> 瀏覽設(shè)計教程

解決canvas轉(zhuǎn)base64jpeg時透明區(qū)域變成黑色背景的方法

在用canvas將png圖片轉(zhuǎn)jpeg時,發(fā)現(xiàn)透明區(qū)域被添補成黑色。

代碼如下:

XML/HTML Code復(fù)制內(nèi)容到剪貼板

  1. <p>Canvas:</p>  

  2. <canvas id="canvas" style="border: 1px solid #ccc;"></canvas>  

  3. <br>  

  4. <p>Base64轉(zhuǎn)碼后的圖片:</p>  

  5. <div id="base64Img"></div>  

  6.   

  7. <script type="text/&#106avascript">  

  8.     var base64Img = document.getElementById("base64Img"),   

  9.         canvas = document.getElementById("canvas"),   

  10.         context = canvas.getContext("2d");   

  11.   

  12.     // 創(chuàng)建新圖片   

  13.     var img = new Image();   

  14.     img.src = "1.png";   

  15.   

  16.     img.addEventListener("load", function() {   

  17.         // 繪制圖片到canvas上   

  18.         canvas.width = img.width;   

  19.         canvas.height = img.height;   

  20.   

  21.         context.drawImage(img, 0, 0);   

  22.   

  23.         getBase64(canvas, function(dataUrl) {   

  24.             // 展示base64位的圖片   

  25.             var newImg = document.createElement("img");   

  26.                 newImg.src = dataUrl;   

  27.   

  28.             base64Img.appendChild(newImg);   

  29.         });   

  30.     }, false);   

  31.   

  32.     // 獲取canvas的base64圖片的dataURL(圖片格式為image/jpeg)   

  33.     function getBase64(canvas, callback) {   

  34.         var dataURL = canvas.toDataURL("image/jpeg");   

  35.   

  36.         if(typeof callback !== undefined) {   

  37.             callback(dataURL);   

  38.         }   

  39.     }   

  40. </script>  

結(jié)果如下:

為什么canvas會png的透明區(qū)域轉(zhuǎn)成黑色呢?

canvas轉(zhuǎn)換成jpeg之前移除alpha通道,所以透明區(qū)域被添補成了黑色。

但是,我們盼望的是,canvas可以將png的透明區(qū)域添補成白色。

那么怎么將canvas中的透明區(qū)域添補成白色呢?

以下是我實踐過的兩種解決方案,盼望對你有幫助。

解決方案一:將透明的pixel設(shè)成白色

由于png圖片的背景都是透明的,所以我們可以探求透明的pixel,然后將其悉數(shù)設(shè)置成白色,核心代碼如下:

&#106avascript Code復(fù)制內(nèi)容到剪貼板

  1. // 將canvas的透明背景設(shè)置成白色   

  2. var imageData = context.getImageData(0, 0, canvas.width, canvas.height);   

  3. for(var i = 0; i < imageData.data.length; i += 4) {   

  4.     // 當(dāng)該像素是透明的,則設(shè)置成白色   

  5.     if(imageData.data[i + 3] == 0) {   

  6.         imageData.data[i] = 255;   

  7.         imageData.data[i + 1] = 255;   

  8.         imageData.data[i + 2] = 255;   

  9.         imageData.data[i + 3] = 255;    

  10.     }   

  11. }   

  12. context.putImageData(imageData, 0, 0);  

完備代碼如下:

XML/HTML Code復(fù)制內(nèi)容到剪貼板

  1. <p>Canvas:</p>  

  2. <canvas id="canvas" style="border: 1px solid #ccc;"></canvas>  

  3. <br>  

  4. <p>Base64轉(zhuǎn)碼后的圖片:</p>  

  5. <div id="base64Img"></div>  

  6.   

  7. <script type="text/&#106avascript">  

  8.     var base64Img = document.getElementById("base64Img"),   

  9.         canvas = document.getElementById("canvas"),   

  10.         context = canvas.getContext("2d");   

  11.   

  12.     // 創(chuàng)建新圖片   

  13.     var img = new Image();   

  14.     img.src = "1.png";   

  15.   

  16.     img.addEventListener("load", function() {   

  17.         // 繪制圖片到canvas上   

  18.         canvas.width = img.width;   

  19.         canvas.height = img.height;   

  20.   

  21.         context.drawImage(img, 0, 0);   

  22.   

  23.         // 將canvas的透明背景設(shè)置成白色   

  24.         var imageData = context.getImageData(0, 0, canvas.width, canvas.height);   

  25.         for(var i = 0; i < imageData.data.length; i += 4) {   

  26.             // 當(dāng)該像素是透明的,則設(shè)置成白色   

  27.             if(imageData.data[i + 3] == 0) {   

  28.                 imageData.data[i] = 255;   

  29.                 imageData.data[i + 1] = 255;   

  30.                 imageData.data[i + 2] = 255;   

  31.                 imageData.data[i + 3] = 255;    

  32.             }   

  33.         }   

  34.         context.putImageData(imageData, 0, 0);   

  35.   

  36.         // 展示base64位的圖片   

  37.         getBase64(canvas, function(dataUrl) {   

  38.             var newImg = document.createElement("img");   

  39.                 newImg.src = dataUrl;   

  40.   

  41.             base64Img.appendChild(newImg);   

  42.         });   

  43.     }, false);   

  44.   

  45.     // 獲取canvas的base64圖片的dataURL(圖片格式為image/jpeg)   

  46.     function getBase64(canvas, callback) {   

  47.         var dataURL = canvas.toDataURL("image/jpeg");   

  48.   

  49.         if(typeof callback !== undefined) {   

  50.             callback(dataURL);   

  51.         }   

  52.     }   

  53. </script>  

結(jié)果如下:

瑕玷顯而易見。當(dāng)png圖片上存在半透明區(qū)域時,會將其添補為黑色。這是我們不盼望的。

解決方案二:在canvas繪制前添補白色背景

核心代碼如下:

&#106avascript Code復(fù)制內(nèi)容到剪貼板

  1. // 在canvas繪制前添補白色背景   

  2. context.fillStyle = "#fff";   

  3. context.fillRect(0, 0, canvas.width, canvas.height);  

完備代碼如下:

XML/HTML Code復(fù)制內(nèi)容到剪貼板

  1. <p>Canvas:</p>  

  2. <canvas id="canvas" style="border: 1px solid #ccc;"></canvas>  

  3. <br>  

  4. <p>Base64轉(zhuǎn)碼后的圖片:</p>  

  5. <div id="base64Img"></div>  

  6.   

  7. <script type="text/&#106avascript">  

  8.     var base64Img = document.getElementById("base64Img"),   

  9.         canvas = document.getElementById("canvas"),   

  10.         context = canvas.getContext("2d");   

  11.   

  12.     // 創(chuàng)建新圖片   

  13.     var img = new Image();   

  14.     img.src = "1.png";   

  15.   

  16.     img.addEventListener("load", function() {   

  17.         // 繪制圖片到canvas上   

  18.         canvas.width = img.width;   

  19.         canvas.height = img.height;   

  20.   

  21.         // 在canvas繪制前添補白色背景   

  22.         context.fillStyle = "#fff";   

  23.         context.fillRect(0, 0, canvas.width, canvas.height);   

  24.   

  25.         context.drawImage(img, 0, 0);   

  26.   

  27.         // 展示base64位的圖片   

  28.         getBase64(canvas, function(dataUrl) {   

  29.             var newImg = document.createElement("img");   

  30.                 newImg.src = dataUrl;   

  31.   

  32.             base64Img.appendChild(newImg);   

  33.         });   

  34.     }, false);   

  35.   

  36.     // 獲取canvas的base64圖片的dataURL(圖片格式為image/jpeg)   

  37.     function getBase64(canvas, callback) {   

  38.         var dataURL = canvas.toDataURL("image/jpeg");   

  39.   

  40.         if(typeof callback !== undefined) {   

  41.             callback(dataURL);   

  42.         }   

  43.     }   

  44. </script>  

結(jié)果如下:

Perfect!

顯然,在canvas繪制前添補白色背景這種方法,不僅簡單,而且對png圖片的半透明區(qū)域添補難看的黑色塊。保舉這種解決方案。

另:canvas.toDataURL()方法不許可處理跨域圖片。否則會報錯。

總結(jié)

以上就是這篇文章的悉數(shù)內(nèi)容了,盼望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來肯定的幫助,假如有疑問大家可以留言交流。

[教程作者:子匠_Zijor]
免責(zé)聲明:本站文章系圖趣網(wǎng)整理發(fā)布,如需轉(zhuǎn)載,請注明出處,素材資料僅供個人學(xué)習(xí)與參考,請勿用于商業(yè)用途!
本文地址:http://pkvc.cn/tutorial/wd3329.html
HTML5頭部<meta>標(biāo)簽的一些常用信息小結(jié)
HTML5頁面音視頻在微信和app下主動播放的實現(xiàn)方法
圖趣網(wǎng)微信
建議反饋
×