デモページ WEBカメラの画像をローカルに保存する事が目的です(IE は WebRTC が使えないので、通常動画で代替)。Webカメラが無い場合は、動画で代替えます。 IE 以外は toDataURL を アンカーの href にセットしてダウンロードする事ができますが、例によって IE は特別な方法を取ります。 IE11 は長い URL がダメ 根本的に IE は無理です。このあたりの制限はずっと昔からありました。Edge は正しくデータとして取れるのですが、アンカーの href としては使えず、img の src としてならば使えます。いずれにしても、ダウンロードは別の方法である Blob を使うのですが、jpeg としてダウンロードするには、さらにひと工夫が必要そうです。できそうな資料はありましたが、動作は未確認です。動作確認しました。IE11 で JPEG 保存可能です。
// IE の場合
if ( typeof(MSBlobBuilder) != "undefined" ) {
var jpeg = canvas.toDataURL("image/jpeg") // JPEG
var bin = atob(jpeg.split(',')[1]);
var buffer = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) {
buffer[i] = bin.charCodeAt(i);
}
var blob = new Blob([buffer.buffer], {type: "image/jpeg"});
navigator.msSaveBlob(blob, "canvas.jpg" );
}
<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<link rel="shortcut icon" href="https://lightbox.sakura.ne.jp/homepage/WinOfSql.ico">
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.3/toastr.min.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/2.1.3/toastr.min.js"></script>
<style>
input {
font-size: 20px;
}
#camera {
width: 400px;
height: 300px;
}
#canvas,#camera {
border: 1px solid #000;
}
</style>
<input id="copy" type="button" value="copy">
<input id="save" type="button" value="save">
<br>
<br>
<video id="camera" autoplay></video>
<canvas id="canvas" width="400" height="300"></canvas>
<script>
jQuery.isMobile = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));
toastr.options.positionClass = "toast-top-center";
if ( $.isMobile ) {
$("#camera").css("width","100%");
$("#canvas").css("width","100%");
}
// カメラ用 video 要素(DOM オブジェクト)
var camera;
// 静止画用 canvas 要素(DOM オブジェクト)
var cancas;
check();
// *************************************
// Canvas へコピー
// *************************************
$("#copy").on( "click", function(){
camera = $("#camera").get(0);
canvas = $("#canvas").get(0);
var ctx = canvas.getContext('2d');
// カメラから キャンバスに静止画を描く
ctx.drawImage(camera, 0, 0, 400, 300);
});
// *************************************
// Canvas の画像を保存
// *************************************
$("#save").on( "click", function(){
// IE の場合
if ( typeof(MSBlobBuilder) != "undefined" ) {
// var blobBuilderObject = new MSBlobBuilder();
// blobBuilderObject.append( canvas.msToBlob() );
// navigator.msSaveBlob(blobBuilderObject.getBlob(), "canvas.png" ); // PNG
var jpeg = canvas.toDataURL("image/jpeg") // JPEG
var bin = atob(jpeg.split(',')[1]);
var buffer = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) {
buffer[i] = bin.charCodeAt(i);
}
var blob = new Blob([buffer.buffer], {type: "image/jpeg"});
navigator.msSaveBlob(blob, "canvas.jpg" );
}
else {
var jpeg = canvas.toDataURL("image/jpeg") // JPEG
var download = $("<a></a>").appendTo("body").css("display","none");
download.prop({"href" : jpeg, "download": "canvas.jpg" });
download.get(0).click();
download.remove();
}
});
// *************************************
// navigator.getUserMedia チェック
// *************************************
function check() {
if ( !navigator.mediaDevices ) {
var api = [
"webkitGetUserMedia", "mozGetUserMedia","msGetUserMedia"
]
$.each(api,function(idx){
if (navigator.getUserMedia = navigator.getUserMedia || navigator[api[idx]]) {
return false;
}
});
if ( !navigator.getUserMedia ) {
error("WebRTC を使用できません");
return;
}
}
// WEBカメラの初期化
init();
}
// *************************************
// カメラストリーム
// *************************************
function init() {
camera = $("#camera").get(0);
if ( navigator.mediaDevices ) {
console.log("navigator.mediaDevices.getUserMedia");
navigator.mediaDevices.getUserMedia({video: true})
.then(function(stream){
camera.src = window.URL.createObjectURL(stream);
})
.catch(function(err){
error(err.name);
}); }
else {
console.log("navigator.getUserMedia");
navigator.getUserMedia(
{video: true},
function(stream) {
camera.src = window.URL.createObjectURL(stream);
},
function(err){
error(err.name);
}
);
}
}
// *************************************
// エラー処理
// ※ 動画で代替
// *************************************
function error( message ) {
toastr.error( message + "<br>代替として動画を表示します" );
$("#camera")
.prop({
"loop" : true, "muted" : true, "controls" : true,
"src" : "https://lightbox.sakura.ne.jp/demo/mp4/waterfall-free-video9.mp4"
})
.css("border", "solid 1px #000");
}
</script>
</body>
</html>
関連する記事 WEB ブラウザで WEBカメラをテストするテンプレート / Android Chrome でテストすると【今は】カメラの front と back を切り替えできます 参考にすべき資料 Microsoft: キャンバスの画像をローカルに保存する Microsoft : BlobBuilder を使ってファイルを作成する Canvas に描いた画像を png などの形式の Blob に変換する方法
|
|
【WEBブラウザの最新記事】
- CSS の @media screen と IFRAME を使用して PC コンテンツとスマホページを完全に別作成して切り替える
- WEB ブラウザで WEBカメラをテストするテンプレート / Android Chrome でテストすると【今は】カメラの front と back を切り替えできます
- iPhone を EpocCam というアプリで Wi-Fi の WEBカメラにする場合のいろいろ知っておく事。
- ブラウザ別『Java 無効』
- IE、Firefox、Chrome、Opera、Safari で JavaScript を無効にする
- ブラウザの入力履歴の削除( 特にパスワード )
- IE、Firefox、Chrome、Opera、Safari のキャッシュ削除のショートカット
- ブラウザを使用した簡易パーセントエンコーディング変換
- 各ブラウザで、onbeforeunload を使おうとすると
- 2014年7月7日現在。WEBフォントの実際
- IE の占める割合の変遷と IE8 でないと動かないシステムの現実
- Flash Playerに危険な脆弱性( またかというかこっちもか )。13.0.0.206 である事を確認しましょう。
- デベロッパーツールを使用してクッキーの一覧を表示する
- Seesaa ブログの『保存ボタンが表示されない』
- Firefox のみのレイアウトトラブル / float:left と line-height
- ブラウザ毎の「開発者ツール」の起動と知っておくべき要点
- ブラウザ別『ソース』の表示
- 各ブラウザの現在の「document.charset」と「document.characterSet」
- Favicon の動的変更・または追加( IE8、Firefox、Chrome、Opera、Safari )
- Opera の window.open のバグ






