上传前为chart.js设置非透明背景色

nkkqxpd9  于 2023-11-18  发布在  Chart.js
关注(0)|答案(2)|浏览(173)

我有一个canvas,声明如下:

  1. <canvas class="grph" id="log_graph"></canvas>

字符串
在上面画了一个折线图后,我想把它上传到服务器,所以我这样做:

  1. var canvas = document.getElementById('log_graph'),
  2. ctx = canvas.getContext('2d');
  3. var upload = (blob) => {
  4. var formdata = new FormData();
  5. formdata.append('img', blob, 'filename.png');
  6. $.post({
  7. url: `${app.server}/upload-img`,
  8. data: formdata,
  9. processData: false,
  10. contentType: false,
  11. success: (data) => {
  12. console.log(`rc for upload: ${data}`);
  13. },
  14. error: function (jqXHR, textStatus, errorThrown) {
  15. console.warn("Error, status = " + textStatus + ", " +
  16. "error thrown: " + errorThrown);
  17. }
  18. });
  19. }
  20. canvas.toBlob(upload, 'image/png');


不幸的是,上传的图表是透明的,在深色风格的图像查看器上看起来不太好。我想将背景设置为纯白色,但似乎 * chart.js * 不支持。
使用background-color css样式很容易设置屏幕背景色,但这不会影响上传的图像,它仍然是透明的颜色。

mpgws1up

mpgws1up1#

我做的方法如下:我保存画布的状态,填充背景,导出,然后恢复以摆脱背景。
转换成代码,这给出了以下代码:

  1. var canvas = document.getElementById('log_graph'),
  2. ctx = canvas.getContext('2d');
  3. ctx.save();
  4. ctx.globalCompositeOperation = 'destination-over';
  5. ctx.fillStyle = "white";
  6. ctx.fillRect(0, 0, canvas.width, canvas.height);
  7. /*
  8. EXPORT CODE
  9. */
  10. ctx.restore();

字符串

o0lyfsai

o0lyfsai2#

所以我找到的一个解决方案是创建一个空画布,用实心白色填充它,然后将图表复制到它上面,然后上传新画布。它是这样的:

  1. var canvas = document.getElementById('log_graph'),
  2. ctx = canvas.getContext('2d');
  3. // we want to set white background to the canvas, so we create a temporary canvas for that:
  4. // create new canvas, same size as original:
  5. var canvas2 = document.createElement('canvas');
  6. canvas2.width = canvas.width;
  7. canvas2.height = canvas.height;
  8. var ctx2 = canvas2.getContext('2d');
  9. ctx2.fillStyle = 'white';
  10. ctx2.fillRect(0, 0, canvas2.width, canvas2.height);
  11. ctx2.drawImage(canvas, 0, 0);
  12. var upload = ... (same as above)
  13. // very important: use canvas2 here!
  14. canvas2.toBlob(upload, 'image/png');

字符串
希望这些知识分享能帮助到别人!

展开查看全部

相关问题