将透明区域为黑色背景当画布变成Base64/JPEG方法

将透明区域为黑色背景当画布变成Base64/JPEG方法
当使用画布将PNG图片转换为JPEG时,发现透明区域被填充为黑色。

代码如下:

xml代码将内容复制到剪贴板。
帆布:
Base64编码的图片:
无功base64img = document.getelementbyid(base64img ),
画布document.getelementbyid(画布),
背景canvas.getcontext(2D);

创建新图片
VaR img =新的图像();
img.src =1。png;

Img.addEventListener(负荷
将图片绘制到画布上
canvas.width = img.width;
canvas.height = img.height;

context.drawimage(1mg,0, 0);

getbase64(帆布、功能(dataurl){
图为 / / Base64
无功newimg = document.createelement(IMG);
newimg.src = dataurl;

base64img.appendchild(newimg);
});
},假);

Base64 / /帆布得到图片的dataurl(图片格式的图像和JPEG)
功能getbase64(帆布、回调){
无功dataurl = canvas.todataurl(图像/ JPEG );

如果(typeof回调!=未定义的){
回调(dataurl);
}
}
结果如下:
为什么画布将PNG的透明区域变为黑色

在画布被转换为jpeg之前,alpha通道被移除,透明区域被填充为黑色。

然而,我们希望画布能将PNG的透明区域填充为白色。

那么如何将画布的透明区域填充成白色呢

以下是我练习过的两个解决方案,希望能对你有所帮助。

解决方案之一:将透明像素设置为白色

因为PNG图片的背景是透明的,所以我们可以寻找一个透明的像素,然后将其全部设置为白色。核心代码如下所示:

Javascript代码将内容复制到剪贴板。
透明背景画布白色
VaR数据= context.getimagedata(0, 0,canvas.width,帆布,高度);
对于(var i = 0;i < imagedata.data.length;i = 4){
当该像素是透明的时,将其设置为白色。
如果(数据。数据{ 3 } = =我+ 0){
数据。数据{我} = 255;
数据。数据{我} = 255 + 1;
数据。数据{我} = 255 + 2;
数据。数据{我} = 255 + 3;
}
}
context.putimagedata(影像数据,0, 0);

完整的代码如下所示:

xml代码将内容复制到剪贴板。
帆布:
Base64编码的图片:
无功base64img = document.getelementbyid(base64img ),
画布document.getelementbyid(画布),
背景canvas.getcontext(2D);

创建新图片
VaR img =新的图像();
img.src =1。png;

Img.addEventListener(负荷
将图片绘制到画布上
canvas.width = img.width;
canvas.height = img.height;

context.drawimage(1mg,0, 0);

透明背景画布白色
VaR数据= context.getimagedata(0, 0,canvas.width,帆布,高度);
对于(var i = 0;i < imagedata.data.length;i = 4){
当该像素是透明的时,将其设置为白色。
如果(数据。数据{ 3 } = =我+ 0){
数据。数据{我} = 255;
数据。数据{我} = 255 + 1;
数据。数据{我} = 255 + 2;
数据。数据{我} = 255 + 3;
}
}
context.putimagedata(影像数据,0, 0);

图为 / / Base64
getbase64(帆布、功能(dataurl){
无功newimg = document.createelement(IMG);
newimg.src = dataurl;

base64img.appendchild(newimg);
});
},假);

Base64 / /帆布得到图片的dataurl(图片格式的图像和JPEG)
功能getbase64(帆布、回调){
无功dataurl = canvas.todataurl(图像/ JPEG );

如果(typeof回调!=未定义的){
回调(dataurl);
}
}
结果如下:
缺点是显而易见的,当PNG图片中有半透明区域时,它被填充为黑色,这就是我们不想要的。

解决方案二:在绘制画布之前填充白色背景

核心代码如下所示:

Javascript代码将内容复制到剪贴板。
在画布中/在绘制白色背景之前
context.fillstyle =# FFF;
context.fillrect(0, 0,canvas.width,帆布,高度);

完整的代码如下所示:

xml代码将内容复制到剪贴板。
帆布:
Base64编码的图片:
无功base64img = document.getelementbyid(base64img ),
画布document.getelementbyid(画布),
背景canvas.getcontext(2D);

创建新图片
VaR img =新的图像();
img.src =1。png;

Img.addEventListener(负荷
将图片绘制到画布上
canvas.width = img.width;
canvas.height = img.height;

在画布中/在绘制白色背景之前
context.fillstyle =# FFF;
context.fillrect(0, 0,canvas.width,帆布,高度);

context.drawimage(1mg,0, 0);

图为 / / Base64
getbase64(帆布、功能(dataurl){
无功newimg = document.createelement(IMG);
newimg.src = dataurl;

base64img.appendchild(newimg);
});
},假);

Base64 / /帆布得到图片的dataurl(图片格式的图像和JPEG)
功能getbase64(帆布、回调){
无功dataurl = canvas.todataurl(图像/ JPEG );

如果(typeof回调!=未定义的){
回调(dataurl);
}
}
结果如下:
很完美!

显然,在画布渲染之前填充白色背景的方法不仅简单,而且在PNG图片半透明区域中填充了难看的黑色块。

也:的canvas.todataurl()方法不允许跨域图像处理。否则,这将是错误的。

总结

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一定的帮助。如果有任何疑问,你可以留言。

tag:区域方法透明黑色背景

相关内容