如何从 Chart.js 中下载的图像中删除透明度
Posted
技术标签:
【中文标题】如何从 Chart.js 中下载的图像中删除透明度【英文标题】:How to remove transparency from images downloaded in Chart.js 【发布时间】:2022-01-20 00:09:18 【问题描述】:如何使用 Chart.js 中的 toBase64Image()
函数从下载的图像中删除不透明度?
如果可能,请保存为 JPG 而不是 PNG。
这是代码:
const myChart = new Chart(ctx,
type: 'bar',
data:
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(75, 192, 192, 0.2)',
'rgba(153, 102, 255, 0.2)',
'rgba(255, 159, 64, 0.2)'
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
]
,
options:
scales:
y:
beginAtZero: true
,
animation:
onComplete: function()
image = graficoConsumo.toBase64Image();
);
document.getElementById('btn-download-chart').onclick = function()
// Trigger the download
var a = document.createElement('a');
a.href = image;
a.download = 'myChart.png';
a.click();
【问题讨论】:
【参考方案1】:默认情况下,画布没有背景,因此它始终是透明的。要解决此问题,您可以编写一个小型自定义插件,在 chart.js 在其上绘制内容之前绘制白色背景:
Chart.register(
id: 'customBackground',
beforeDraw: (chart, args, opts) =>
const ctx = chart.canvas.getContext('2d');
ctx.save();
ctx.globalCompositeOperation = 'destination-over';
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, chart.width, chart.height);
ctx.restore();
)
const options =
type: 'line',
data:
labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
datasets: [
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3],
borderColor: 'orange'
,
label: '# of Points',
data: [7, 11, 5, 8, 3, 7],
borderColor: 'pink'
]
,
options: ,
const ctx = document.getElementById('chartJSContainer').getContext('2d');
new Chart(ctx, options);
body
background-color: black;
<body>
<canvas id="chartJSContainer" ></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.6.2/chart.js"></script>
</body>
【讨论】:
以上是关于如何从 Chart.js 中下载的图像中删除透明度的主要内容,如果未能解决你的问题,请参考以下文章