【发布时间】:2019-10-31 22:45:13
【问题描述】:
我使用 ChartJS 并将它们保存在本地,将画布上的图表图像转换为数据块,然后保存。但是我无法设置我保存的任何画布图表的背景颜色,我只能保存没有背景颜色的图表,让用户感到困惑。
到目前为止我尝试过的是:
- 将image/png的类型改为image/jpg
- 创建具有样式的文档并将其作为子项附加到我的 document.createElement 将有图像
- 为我的“链接”赋予与 document.createElement 相同的样式 以上
但是没有成功,图片是在没有背景的情况下正确下载的。
我正在搜索并找到了一些主题:
create a canvas with background image and save
save canvas with background image
但是,在所有工作结束时,无法为我找到解决方案。
我在 html 上的图表是:
<canvas id="divName"></canvas>
用于保存图像的打字稿函数,使用 bytearray 创建一个新的 blob,图像的类型是:(该代码已尝试添加背景颜色)
saveimg(divName){
let canvas:any;
let style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = '.cssClass { background-color: "aquamarine"; }';
if(this.deviceValue != null) {
canvas = document.getElementById(this.deviceValue);
}
else {
canvas = document.getElementById(divName);
}
//SOLUTION that works BY Caleb Miller ***********
fillCanvasBackground(canvas, 'white');
function fillCanvasBackground(canvasc, color)
{
const context = canvasc.getContext('2d');
context.save();
context.globalCompositeOperation = 'destination-over';
context.fillStyle = color;
context.fillRect(0, 0, canvasc.width, canvasc.height);
context.restore();
}
// end***********************
let dataURL = canvas.toDataURL();
let datablob = dataURL.substring(dataURL.indexOf(",") + 1);
let byteCharacters = atob(datablob);
let byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
let byteArray = new Uint8Array(byteNumbers);
let blob = new Blob([byteArray], {"type": "image/jpg"});
if(navigator.msSaveBlob){
let filename = this.chartTitle + ' - ' + this.entityName;
navigator.msSaveBlob(blob, filename);
} else {
let filename =this.chartTitle + ' - ' + this.entityName;
let link = document.createElement("a");
link.onload = function() {
canvas.drawImage(0,0);
};
document.getElementsByTagName('a')[0].appendChild(style);
link.href = URL.createObjectURL(blob);
link.setAttribute('visibility','hidden');
link.download = filename;
link.style.backgroundColor = "lightblue repeat-x center";
document.body.appendChild(link).style.background = "lightblue repeat-x center";
link.click();
document.body.removeChild(link);
}
this.deviceValue = null;
}
表达问题的图片:
是否可以为画布图像添加背景颜色?
【问题讨论】:
标签: javascript typescript canvas chart.js