0

我有两张不同尺寸的画布。我的目标是将用户的绘图从主画布复制到第二个画布作为缩小版本。到目前为止,drawImage() 和 scale 似乎工作正常,但第二个画布保留了旧版本的主图和新副本。我每次在调用drawImage()之前都尝试清除它,但这似乎没有做任何事情。每次函数运行时,如何仅将当前图像复制到辅助画布?

$('#hand').dblclick(function(){
 var canvas = document.getElementById('myCanvas');
 var context = canvas.getContext('2d');
 //var imageData = context.getImageData(0, 0, 100, 100);
 var newCanvas = document.getElementById('scaledCanvas');
 var destCtx = newCanvas.getContext('2d');
 destCtx.clearRect(0, 0, newCanvas.width, newCanvas.height);
 destCtx.scale(.5,.5);
 destCtx.drawImage(canvas, 0, 0);
});

如有必要,我可以包含更多代码。我也刚刚意识到规模不断被调用;这解释了为什么新复制的图像每次都会变小,所以这可能是另一个问题。

4

1 回答 1

1

实际上很简单,您使用的是所谓的变换(平移、旋转或缩放)。

为了每次“新鲜”地使用它们,您必须每次都保存和恢复画布状态。

$('#hand').dblclick(function(){
 var canvas = document.getElementById('myCanvas');
 var context = canvas.getContext('2d');
 //var imageData = context.getImageData(0, 0, 100, 100);
 var newCanvas = document.getElementById('scaledCanvas');
 var destCtx = newCanvas.getContext('2d');
 destCtx.clearRect(0, 0, newCanvas.width, newCanvas.height);

 //save the current state of this canvas' drawing mode
 destCtx.save();

 destCtx.scale(.5,.5);
 destCtx.drawImage(canvas, 0, 0);

 //restore destCtx to a 1,1 scale (and also 0,0 origin and 0 rotation)
 destCtx.restore();

});

同样重要的是要注意您可以在调用恢复之前多次推送,以便使用递归函数等执行许多很酷的几何技巧......

看看这个状态和转换的解释: https ://developer.mozilla.org/en-US/docs/HTML/Canvas/Tutorial/Transformations

希望这可以帮助您更好地理解画布转换。

于 2013-02-05T04:44:29.253 回答