我的问题始于 KineticJS 的第 5 版,在此之前它不是问题。可以使用 stage.toDataURL 函数将原生 KineticJS 形状(例如正方形和圆形)保存到图像文件中。但它不适用于使用诸如 beginPath() 等普通画布方法绘制的非动力学形状;和 canvas.fill(); (第 4 版做得很好)。下面的代码绘制了两个矩形,一个红色,一个蓝色。红色是自定义的,蓝色是原生动态矩形。
<body>
<div id="container"></div>
<button id="save">
Save as image
</button>
<script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v5.0.2.min.js"> </script>
<script>
var stage = new Kinetic.Stage({
container: 'container',
width: 578,
height: 200
});
var layer = new Kinetic.Layer();
var box = new Kinetic.Rect({
x: 400,
y: 80,
width: 100,
height: 50,
fill: '#00D2FF',
stroke: 'black',
strokeWidth: 4,
draggable: true
});
layer.add(box);
stage.add(layer);
var canvas = layer.getCanvas().getContext('2d');
canvas.beginPath();
canvas.setAttr('strokeStyle', 'black');
canvas.setAttr('fillStyle', '#FF2222');
canvas.setAttr('lineWidth', 8);
canvas.rect(50,80,100,50);
canvas.stroke();
canvas.fill();
document.getElementById('save').addEventListener('click', function() {
stage.toDataURL({
callback: function(dataUrl) {
window.location.href = dataUrl;
}
});
}, false);
</script>
</body>
两个形状都出现了,但只有蓝色矩形出现在由 toDataURL 函数生成的图像中。它们的绘制方式在 KineticJS 5 中发生了变化,您在其中设置了 fillStyle 等属性,所以我认为这可能与它有关,或者可能是在将图层添加到图层之后添加了自定义形状的事实阶段...