如何从 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 中下载的图像中删除透明度的主要内容,如果未能解决你的问题,请参考以下文章

如何从chart.js中删除值

Chart.js 从图例中删除数据集值的标签

使用php从边框中删除透明区域(裁剪透明)

删除 chart.js 中的 x 轴标签/文本

从透明表格上的图像中删除轮廓

从图像中删除白色背景并使其透明