データ URI を使用してキャンバス要素内に画像を描画しようとしています。私は Django を使用しており、写真の base64 エンコーディングを含む変数をテンプレートに渡しています。過去に、私はそれを次のように使用しました:
<img src="data:image/jpg;base64, {{ photo_data }}">
これはうまくいきます。私は今それをこれに置き換えたい:
<canvas id="canvas"></canvas>
JavaScriptを使用してキャンバスに画像を描画します。この回答からコードを試しました:
var canvas = $('#canvas');
var ctx = canvas.getContext('2d');
var img = new Image;
$(img).load(function(){
ctx.drawImage(img, 0, 0);
});
img.src = "data:image/jpg;base64, {{ photo_data }}"
これにより、最後の行に「SyntaxError: unterminated stringliteral」という JavaScript エラーが表示されます。このエラーは通常、改行が原因で発生することを読みました。ページ ソースを調べると、そこに改行があるように見えます。
それで、改行を削除しようとしました:
function removeBreaks(data){
return data.replace(/(\r\n|\n|\r)/gm, "");
}
var photo_data = removeBreaks({{ photo_data }});
removeBreaks を呼び出すと、新しいエラーが発生します。「SyntaxError: 識別子は数値リテラルの直後に始まります」.
var photo_data = removeBreaks(/9j/4AAQSkZ...
----------------------------------^
私がする必要があるある種のエスケープはありますか?もしそうなら、どうすればいいですか?
アップデート
コメントと回答からのすべての提案を試しました。これまでのところ、作業に最も近づいているのは
photo_data = json.dumps(<base64 encoded image file>)
Django側と
var photo_data = "{{ photo_data }}".replace(/"/g,"");
img.src = "data:image/jpg;base64, " + photo_data;
Javascript 側で。s を置き換えないと画像がまったく表示されず、"
削除すると画像の上 3 分の 1 だけが表示されます。キャンバス要素のサイズを変更しようとしましたが、それは問題ではないようです。
アップデート #2
キャンバスのサイズが問題であることがわかりました。キャンバス要素の幅と高さは、オブジェクトを作成したときに設定していなかった画像の幅と高さと同じかそれ以上である必要がありImage
ます。受け入れられた回答と json.dumps ("
警告付き) の両方が元の問題を解決するために機能します。