在用canvas将png照片转jpeg时,发现全透明地区被填充成黑色。
编码以下:
XML/HTML Code拷贝內容到剪贴板
- <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会png的全透明地区转成黑色呢?
canvas变换成jpeg以前移除alpha安全通道,因此全透明地区被填充变成黑色。
可是,大家期待的是,canvas能够将png的全透明地区填充成白色。
那末如何将canvas中的全透明地区填充成白色呢?
下列是我实践活动过的两种处理计划方案,期待对你有协助。
处理计划方案1:将全透明的pixel设成白色
由于png照片的情况全是全透明的,因此大家能够找寻全透明的pixel,随后将其所有设定成白色,关键编码以下:
JavaScript Code拷贝內容到剪贴板
-
- 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);
详细编码以下:
XML/HTML Code拷贝內容到剪贴板
- <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>
实际效果以下:
缺陷不言而喻。当png照片上存在半全透明地区时,会将其填充为黑色。这是大家不期待的。
处理计划方案2:在canvas绘图前填充白色情况
关键编码以下:
JavaScript Code拷贝內容到剪贴板
-
- context.fillStyle = "#fff";
- context.fillRect(0, 0, canvas.width, canvas.height);
详细编码以下:
XML/HTML Code拷贝內容到剪贴板
- <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>
实际效果以下:
Perfect!
明显,在canvas绘图前填充白色情况这类方式,不但简易,并且对png照片的半全透明地区填充不好看的黑色块。强烈推荐这类处理计划方案。
另:canvas.toDataURL()方式不容许解决跨域照片。不然会出错。
总结
以上便是这篇文章内容的所有內容了,期待本文的內容对大伙儿的学习培训或工作中能带来1定的协助,假如有疑惑大伙儿能够留言沟通交流。