Изображение HTML5 canvas.toDataURL() не имеет цвета фона

проблема

При использовании .toDataURL() элемента HTML5 <canvas> свойство background-color элемента не применяется к изображению.

Вопрос

Это происходит потому, что background-color самом деле не является частью canvas, а стиль DOM? Если это так или что-то еще, что может быть обходным путем для этого?

скрипка

Поиграй здесь. Строка base64 записывается в консоль.

Дополнительная информация

Полотно создано из svg используя https://code.google.com/p/canvg/

Ответ 1

Вы правы, что на самом деле это не часть данных изображения, а только часть стиля. Самый простой способ - просто нарисовать прямоугольник перед рисованием SVG:

var canvas = document.getElementById('test');
var ctx = canvas.getContext('2d');
ctx.fillStyle = 'green';
ctx.fillRect(0, 0, canvas.width, canvas.height);

Ответ 2

Другой подход может заключаться в создании манекена CANVAS и копировании на него исходного содержимого CANVAS.

//create a dummy CANVAS

destinationCanvas = document.createElement("canvas");
destinationCanvas.width = srcCanvas.width;
destinationCanvas.height = srcCanvas.height;

destCtx = destinationCanvas.getContext('2d');

//create a rectangle with the desired color
destCtx.fillStyle = "#FFFFFF";
destCtx.fillRect(0,0,srcCanvas.width,srcCanvas.height);

//draw the original canvas onto the destination canvas
destCtx.drawImage(srcCanvas, 0, 0);

//finally use the destinationCanvas.toDataURL() method to get the desired output;
destinationCanvas.toDataURL();

Ответ 3

надеюсь, это поможет,

var canvas = document.getElementById('test');

var context = canvas.getContext('2d');

//cache height and width        
var w = canvas.width;
var h = canvas.height;

var data = context.getImageData(0, 0, w, h);

var compositeOperation = context.globalCompositeOperation;

context.globalCompositeOperation = "destination-over";
context.fillStyle = "#fff";
context.fillRect(0,0,w,h);

var imageData = canvas.toDataURL("image/png");

context.clearRect (0,0,w,h);
context.putImageData(data, 0,0);        
context.globalCompositeOperation = compositeOperation;

var a = document.createElement('a');
a.href = imageData;
a.download = 'template.png';
a.click();