91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決canvas轉base64/jpeg時透明區域變成黑色背景的問題

發布時間:2021-08-30 15:29:52 來源:億速云 閱讀:170 作者:小新 欄目:web開發

小編給大家分享一下如何解決canvas轉base64/jpeg時透明區域變成黑色背景的問題,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

在用canvas將png圖片轉jpeg時,發現透明區域被填充成黑色。

代碼如下:

<p>Canvas:</p>  
<canvas id="canvas" style="border: 1px solid #ccc;"></canvas>  
<br>  
<p>Base64轉碼后的圖片:</p>  
<div id="base64Img"></div>  
  
<script type="text/javascript">  
    var base64Img = document.getElementById("base64Img"),   
        canvas = document.getElementById("canvas"),   
        context = canvas.getContext("2d");   
  
    // 創建新圖片   
    var img = new Image();   
    img.src = "1.png";   
  
    img.addEventListener("load", function() {   
        // 繪制圖片到canvas上   
        canvas.width = img.width;   
        canvas.height = img.height;   
  
        context.drawImage(img, 0, 0);   
  
        getBase64(canvas, function(dataUrl) {   
            // 展示base64位的圖片   
            var newImg = document.createElement("img");   
                newImg.src = dataUrl;   
  
            base64Img.appendChild(newImg);   
        });   
    }, false);   
  
    // 獲取canvas的base64圖片的dataURL(圖片格式為image/jpeg)   
    function getBase64(canvas, callback) {   
        var dataURL = canvas.toDataURL("image/jpeg");   
  
        if(typeof callback !== undefined) {   
            callback(dataURL);   
        }   
    }   
</script>

效果如下:

如何解決canvas轉base64/jpeg時透明區域變成黑色背景的問題

為什么canvas會png的透明區域轉成黑色呢?

canvas轉換成jpeg之前移除alpha通道,所以透明區域被填充成了黑色。

但是,我們希望的是,canvas可以將png的透明區域填充成白色。

那么怎么將canvas中的透明區域填充成白色呢?

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

解決方案一:將透明的pixel設成白色

因為png圖片的背景都是透明的,所以我們可以尋找透明的pixel,然后將其全部設置成白色,核心代碼如下:

// 將canvas的透明背景設置成白色   
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);   
for(var i = 0; i < imageData.data.length; i += 4) {   
    // 當該像素是透明的,則設置成白色   
    if(imageData.data[i + 3] == 0) {   
        imageData.data[i] = 255;   
        imageData.data[i + 1] = 255;   
        imageData.data[i + 2] = 255;   
        imageData.data[i + 3] = 255;    
    }   
}   
context.putImageData(imageData, 0, 0);

完整代碼如下:

<p>Canvas:</p>  
<canvas id="canvas" style="border: 1px solid #ccc;"></canvas>  
<br>  
<p>Base64轉碼后的圖片:</p>  
<div id="base64Img"></div>  
  
<script type="text/javascript">  
    var base64Img = document.getElementById("base64Img"),   
        canvas = document.getElementById("canvas"),   
        context = canvas.getContext("2d");   
  
    // 創建新圖片   
    var img = new Image();   
    img.src = "1.png";   
  
    img.addEventListener("load", function() {   
        // 繪制圖片到canvas上   
        canvas.width = img.width;   
        canvas.height = img.height;   
  
        context.drawImage(img, 0, 0);   
  
        // 將canvas的透明背景設置成白色   
        var imageData = context.getImageData(0, 0, canvas.width, canvas.height);   
        for(var i = 0; i < imageData.data.length; i += 4) {   
            // 當該像素是透明的,則設置成白色   
            if(imageData.data[i + 3] == 0) {   
                imageData.data[i] = 255;   
                imageData.data[i + 1] = 255;   
                imageData.data[i + 2] = 255;   
                imageData.data[i + 3] = 255;    
            }   
        }   
        context.putImageData(imageData, 0, 0);   
  
        // 展示base64位的圖片   
        getBase64(canvas, function(dataUrl) {   
            var newImg = document.createElement("img");   
                newImg.src = dataUrl;   
  
            base64Img.appendChild(newImg);   
        });   
    }, false);   
  
    // 獲取canvas的base64圖片的dataURL(圖片格式為image/jpeg)   
    function getBase64(canvas, callback) {   
        var dataURL = canvas.toDataURL("image/jpeg");   
  
        if(typeof callback !== undefined) {   
            callback(dataURL);   
        }   
    }   
</script>

效果如下:

如何解決canvas轉base64/jpeg時透明區域變成黑色背景的問題

缺點顯而易見。當png圖片上存在半透明區域時,會將其填充為黑色。這是我們不希望的。

解決方案二:在canvas繪制前填充白色背景

核心代碼如下:

// 在canvas繪制前填充白色背景   
context.fillStyle = "#fff";   
context.fillRect(0, 0, canvas.width, canvas.height);

完整代碼如下:

<p>Canvas:</p>  
<canvas id="canvas" style="border: 1px solid #ccc;"></canvas>  
<br>  
<p>Base64轉碼后的圖片:</p>  
<div id="base64Img"></div>  
  
<script type="text/javascript">  
    var base64Img = document.getElementById("base64Img"),   
        canvas = document.getElementById("canvas"),   
        context = canvas.getContext("2d");   
  
    // 創建新圖片   
    var img = new Image();   
    img.src = "1.png";   
  
    img.addEventListener("load", function() {   
        // 繪制圖片到canvas上   
        canvas.width = img.width;   
        canvas.height = img.height;   
  
        // 在canvas繪制前填充白色背景   
        context.fillStyle = "#fff";   
        context.fillRect(0, 0, canvas.width, canvas.height);   
  
        context.drawImage(img, 0, 0);   
  
        // 展示base64位的圖片   
        getBase64(canvas, function(dataUrl) {   
            var newImg = document.createElement("img");   
                newImg.src = dataUrl;   
  
            base64Img.appendChild(newImg);   
        });   
    }, false);   
  
    // 獲取canvas的base64圖片的dataURL(圖片格式為image/jpeg)   
    function getBase64(canvas, callback) {   
        var dataURL = canvas.toDataURL("image/jpeg");   
  
        if(typeof callback !== undefined) {   
            callback(dataURL);   
        }   
    }   
</script>

效果如下:

如何解決canvas轉base64/jpeg時透明區域變成黑色背景的問題

Perfect!

顯然,在canvas繪制前填充白色背景這種方法,不僅簡單,而且對png圖片的半透明區域填充難看的黑色塊。推薦這種解決方案。

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

看完了這篇文章,相信你對“如何解決canvas轉base64/jpeg時透明區域變成黑色背景的問題”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南开区| 定兴县| 肥乡县| 开江县| 福清市| 四平市| 错那县| 明溪县| 云浮市| 怀柔区| 永州市| 江孜县| 大同县| 慈溪市| 阜南县| 泸溪县| 新安县| 汶川县| 娄底市| 龙州县| 恩施市| 农安县| 五台县| 精河县| 天水市| 道真| 陕西省| 忻城县| 六枝特区| 曲麻莱县| 江达县| 鸡东县| 广宗县| 兴宁市| 淅川县| 昭苏县| 连江县| 西畴县| 苏尼特左旗| 兰考县| 塔城市|