当前位置:首页 > 日记 > 正文

将透明区域为黑色背景当画布变成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()方法不允许跨域图像处理。否则,这将是错误的。

总结

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

相关文章

如何在不同的显示器上显示单独的Po

如何在不同的显示器上显示单独的Po

显示,演示文稿,器上,如何在,电脑软件,作为演示,您经常使用微软的PowerPoint,在PowerPoint演示文稿中,我们可以创建内容,如多媒体幻灯片、演讲、笔记和大纲。如何成功地进行演讲是许多初级和初级演讲者的一个主要问题。 今天,PowerPoint 2007/201…

PS图象处理软件科幻裂纹字体特效

PS图象处理软件科幻裂纹字体特效

字体,科幻,图象,处理软件,特效,PS图象处理软件当然是非常美丽的,主要为您介绍PS图象处理软件的使用使科幻裂纹字体特效。我希望每个人都喜欢它。 最终效果 1、一个新的任意大小的文件集,放在蓝色背景材质中,如果你喜欢调整颜色,效果如下。 2,击…

填充多表的固定细胞组

填充多表的固定细胞组

多表,细胞,填充,电脑软件,我们知道每次打开Excel,软件总是默认打开多张工作表,可以看出,Excel更适合在多个相关表的协调工作,除了具有强大的单台处理能力。为了协调关联,当然,你需要同步输入第一。因此,在许多情况下,需要输入相同内容的多个表中的…

关于女孩强烈的英文签名经典签名

关于女孩强烈的英文签名经典签名

英文,女孩,经典,电脑软件,作为一个女孩,她必须学会坚强,以获得你想要的生活。说到强壮,你会想到什么样的英文签名 关于女孩强烈的英文签名节选: 1)有时是没有出路的exlep。 2)有时候,除了说再见,别无选择。 3)不平衡,最终被发现。 4)它离终点很远…

为什么Excel数据的0没有显示出来

为什么Excel数据的0没有显示出来

显示,数据,电脑软件,Excel,将数据导入Excel后,0的数据开始消失,为什么会这样呢 默认的前导零消失在Excel中。如果我们想保存它,我们需要做一些格式化。 打开Excel,在数据选项卡上;获取外部数据;部分点击从文本;。 找到需要打开的目标文件,选择,单击…

Excel2007冻结窗口填写窗体

Excel2007冻结窗口填写窗体

窗体,冻结,窗口,电脑软件,当你填写一个大表格时,你经常需要填写几个页面,而一个屏幕不能显示所有的内容。但是当完整的单元格数据时,我们经常需要控制第一行或列填充内容,使用上下滚动或左视图非常方便。 在这个时候,我们可以使用窗口;冻结;这个…

让PPT自动循环播放

让PPT自动循环播放

循环播放,电脑软件,PPT,在PPT中,我们可以用两种方式让幻灯片自动播放根据自己的需求,手动设置每个环节的游戏时间,或使用排练时间记录每个环节的时间。 (1)设置自动播放时间 自定义动画的指定时间长度 开始powerpoint2013打开演示文稿,所有的…

一只漂泊在海上的小猫的合成

一只漂泊在海上的小猫的合成

小猫,一只,海上,电脑软件,效果画面非常生动,主角是一只小猫,但作者把小猫描绘成一个勇敢的水手,拟人化,独自在海上探险。 最终效果 1。添加水下场景: 1,一个新的1500×1263px文档的创建是在PS图象处理软件如下。 2。打开水下图像。使用移动工具(V…

表文字显示自动交叉页面操作方法标

表文字显示自动交叉页面操作方法标

操作方法,显示,文字,标题,页面,在编辑Word文档时,我们经常在文档中插入一个表格,如果表格略长,如果有可能是一个表分在相邻的两页,今天系统默认的二页形式不是头球,萧边教你在Word表格自动跨页显示操作方法中添加标题标题。 表格页自动显示在Wo…

如何删除excel中的打印行

如何删除excel中的打印行

删除,电脑软件,excel,打印Excel工作表后,会留下几行虚线,如下图所示: 许多学生认为他们已经尝试了很多操作,但仍然不能消除它,除了重新打开它,别无选择。 你可以这样做: 在Excel 2010中,单击文件选项;。 在Excel 2007中,按左上角的Office按钮,然后单…

PS是怎样画出太阳和moon的图形的

PS是怎样画出太阳和moon的图形的

图形,是怎样,画出,电脑软件,PS,月亮的旅行是在旅途中。我自己DIY一个太阳和月亮,我也最爱做的事。让我们进入'经验;如何使用PS圈'圆,月亮;当绘画相当于太阳。 软件名称:Adobe PS图象处理软件8全绿色中文版软件大小:150.1mb更新时间:2015-11-04 …

浅谈mysql的半同步复制

浅谈mysql的半同步复制

同步复制,浅谈,电脑软件,mysql,简介 MySQL通过复制(复制)实现了存储系统的高可用性,目前MySQL支持的复制方法是: 异步复制(异步复制):最简单的原理和最好的性能。但主要的准备之间的数据不一致的概率是非常大的。 半同步复制(半同步复制):与异步复…