キャンバスは、あなたが求めていることを実行できます。
2 つのキャンバスを重ねるだけです。下のキャンバスはフレームです。上部のキャンバス (フレームよりも小さい) が絵です。次に、画像に必要なすべてをアニメーション化できます。アニメーションが単純な場合は、描画された要素を追跡するためのキャンバス ライブラリさえ必要ないかもしれません。SVG のように DOM に要素を追跡させないため、パフォーマンスも優れています。
ところで、フレームが既に SVG で描画されている場合は、SVG フレームの上に描画された 1 つのキャンバスで同じことを行うことができます。実際、必要に応じてフレームに画像を使用することもできます。
ここにコードとフィドルがあります: http://jsfiddle.net/m1erickson/9Tj3s/
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
body{ background-color: ivory; }
#container{
position:relative;
border:1px solid green;
width:1380px;
height:1315px;
}
#frame{
position:absolute;
top:0px;
left:0px;
border:1px solid red;
}
#picture{
position:absolute;
top:66px;
left:67px;
border:1px solid blue;
}
</style>
<script>
$(function(){
var frame=document.getElementById("frame");
var ctxFrame=frame.getContext("2d");
var picture=document.getElementById("picture");
var ctxPicture=picture.getContext("2d");
var img=new Image();
img.onload=function(){
ctxFrame.drawImage(this,0,0,frame.width,frame.height);
}
img.src="http://www.themezoom-neuroeconomics.com/images/5/5e/Golden-frame.jpg";
var dx= 4;
var dy=4;
var y=150;
var x=10;
function draw(){
ctxPicture.clearRect(0,0,243,182);
ctxPicture.beginPath();
ctxPicture.fillStyle="#0000ff";
ctxPicture.arc(x,y,20,0,Math.PI*2,true);
ctxPicture.closePath();
ctxPicture.fill();
if( x<10 || x>225) dx=-dx;
if( y<10 || y>160) dy=-dy;
x+=dx;
y+=dy;
}
setInterval(draw,60);
}); // end $(function(){});
</script>
</head>
<body>
<div id="container">
<canvas id="frame" width=380 height=315></canvas>
<canvas id="picture" width=243 height=182></canvas>
</div>
</body>
</html>