渲染chartjs并将图像导出到不在DOM中的数据

问题描述 投票:0回答:2

我正在前端 React 应用程序中使用 Chart.js。我需要使用 Chart.js 创建一个绘图,以便我可以使用 pptxgen 将其附加到 powerpoint 幻灯片。该图像不必在视觉上呈现,我只需要在用户请求生成 ppt 时创建它即可。

图表需要上下文,因此我创建了一个画布元素来充当这样的角色,然后尝试渲染并导出 Base64 图像,然后将其输入到 pptxgen 中:

  let ctx = document.createElement("canvas")
  ctx.setAttribute("width", "400")
  ctx.setAttribute("height", "400")
  let chart: Chart = new Chart(ctx, {
    type: "bar",
    data: {
      datasets: [{
      barPercentage: 0.5,
      barThickness: 6,
      maxBarThickness: 8,
      minBarLength: 2,
      data: [10, 20, 30, 40, 50, 60, 70]
      }]
    },
    options: {
      scales: {}
    }
  } )

  chart.render()
  console.log(chart.toBase64Image())

但我得到的只是“数据:;”这看起来是一个空图像。

你知道如何让它渲染吗?

javascript chart.js
2个回答
3
投票

如果不将画布附加到 dom,就无法渲染,但你可以隐藏它,它会按预期工作。


const chartEl = document.createElement("canvas");
chartEl.setAttribute("width", "400");
chartEl.setAttribute("height", "400");
chartEl.style.display = "none";

document.body.append(chartEl);
let chart = new Chart(chartEl, {
  type: "bar",
  data: {
    datasets: [
      {
        barPercentage: 0.5,
        barThickness: 6,
        maxBarThickness: 8,
        minBarLength: 2,
        data: [10, 20, 30, 40, 50, 60, 70]
      }
    ]
  },
  options: {
    scales: {},
    animation: false
  }
});

chart.render();
console.log(chart.toBase64Image());
chartEl.remove();


1
投票

渲染图表而无需专门将其添加到 dom 的唯一方法是使用离屏画布,如 Chart.js 文档中所述: https://www.chartjs.org/docs/3.7.1/general/performance.html#parallel-rendering-with-web-workers-chromium-only

缺点是离屏画布 API 仅在基于 chromium 的浏览器中可用。

您可以采取的其他方法是将画布添加到dom,让chart.js渲染它,获取base64表示,然后直接删除画布,如下所示:

let ctx = document.createElement("canvas")
document.documentElement.appendChild(ctx)
ctx.setAttribute("width", "400")
ctx.setAttribute("height", "400")
let chart = new Chart(ctx, {
  type: "bar",
  data: {
    labels: ['a', 'b', 'c', 'd', 'e', 'f', ' g'],
    datasets: [{
      barPercentage: 0.5,
      barThickness: 6,
      maxBarThickness: 8,
      minBarLength: 2,
      data: [10, 20, 30, 40, 50, 60, 70]
    }]
  },
  options: {
    scales: {}
  }
})

const base64 = chart.toBase64Image();

ctx.remove();

console.log(base64)
<body>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.1/chart.js"></script>
</body>

© www.soinside.com 2019 - 2024. All rights reserved.