Htmlを使用してブラウザに(ファイルからの)画像を表示しています...画面のスクリーンショットを撮り続け、画像ファイル「image.jpeg」として保存する別のプログラムがあります。 setTimeoutを使用して、この画像をブラウザに定期的に表示しています。ただし、画像はブラウザ上で変更されていません。
これが私のコードです... javascript関数が実行されるたびに新しい画像が読み込まれるようにImageオブジェクトを使用しましたが、それは機能していないようです...
<html>
<head>
<script type="text/JavaScript">
var x=0, y=0;
var canvas, context, img;
function timedRefresh(timeoutPeriod)
{
canvas = document.getElementById("x");
context = canvas.getContext("2d");
img = new Image();
img.src = "image.jpeg";
context.drawImage(img, x, y);
x+=20; y+=20;
//img.destroy();
setTimeout("timedRefresh(1000)",timeoutPeriod);
}
</script>
<title>JavaScript Refresh Example</title>
</head>
<body onload="JavaScript:timedRefresh(1000);">
<canvas id="x" width="600" height="600" />
</body>
</html>
まず、画像オブジェクトのsrc
属性を設定するとき、画像はまだ読み込まれていません。画像のonload
が起動されたとき(画像が起動されたとき)にキャンバスを更新する必要があります。ロード終わり)。
次に、ブラウザはキャッシュされた画像を使用しようとしますimage.jpeg
。これを回避するには、画像URIに偽の引数を追加します。
例えば :
var timeoutPeriod = 1000;
var imageURI = 'image.jpeg';
var x=0, y=0;
var img = new Image();
img.onload = function() {
var canvas = document.getElementById("x");
var context = canvas.getContext("2d");
context.drawImage(img, x, y);
x+=20; y+=20;
setTimeout(timedRefresh,timeoutPeriod);
};
function timedRefresh() {
// just change src attribute, will always trigger the onload callback
img.src = imageURI + '?d=' + Date.now();
}
そして、それは機能するはずです。
ここに完全な実例があります。 url
とrefeshInterval
を設定するだけです。 Yannick のキャッシュ防止を使用し、 Piotr で提案されているように、リロードのたびにimg
オブジェクトを再作成しません。
<html>
<head>
<script type="text/JavaScript">
var url = "cam1.php"; //url to load image from
var refreshInterval = 1000; //in ms
var drawDate = true; //draw date string
var img;
function init() {
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
img = new Image();
img.onload = function() {
canvas.setAttribute("width", img.width)
canvas.setAttribute("height", img.height)
context.drawImage(this, 0, 0);
if(drawDate) {
var now = new Date();
var text = now.toLocaleDateString() + " " + now.toLocaleTimeString();
var maxWidth = 100;
var x = img.width-10-maxWidth;
var y = img.height-10;
context.strokeStyle = 'black';
context.lineWidth = 2;
context.strokeText(text, x, y, maxWidth);
context.fillStyle = 'white';
context.fillText(text, x, y, maxWidth);
}
};
refresh();
}
function refresh()
{
img.src = url + "?t=" + new Date().getTime();
setTimeout("refresh()",refreshInterval);
}
</script>
<title>JavaScript Refresh Example</title>
</head>
<body onload="JavaScript:init();">
<canvas id="canvas"/>
</body>
</html>
timedRefresh()
で毎回Imageオブジェクトを作成する必要はないと思います。 1つのインスタンスを作成し、そのsrc
属性を絶えず変更するだけです。コードスニペットの場合、img
はグローバル変数である必要があります。
ただし、主な問題は、Operaでまだちらつきが見られることです(ただし、種類は異なります)。参照: Operaを使用したJavaScriptでの画像ソースの更新