12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

INTECAdvent Calendar 2019

Day 13

アプリを使わずにiPhoneで写真を撮る方法

Posted at

#はじめに
アロハ!
 今回は、ネイティブアプリを使わずにiPhoneで写真を撮る方法を書きます。
一般的にiPhoneで写真を撮る方法は、おそらく3つあります。
1つ目は、Appleがプレインストールしている「カメラ」アプリ。
2つ目は、誰かが作ったカメラ系アプリ。Swiftで書いたり、Objective-Cで書いたり。私も以前、「お天気カメラ」というアプリをAppStoreでリリースしていました。(数年前に公開停止しました。)
お天気カメラで写真を撮ると、位置情報からopenweathermap.orgのAPIを叩いて、気象情報を取得して、写真にオーバーレイして保存できるものでした。懐かしい・・・。
3つ目は、Safariを使う方法です。今回は、このお話です。
アプリを入れずに写真を撮って、サーバーへ送ったりできるので、いろんな使い道があります。例えば、文字が書かれた看板を撮影し、OCRで読み込んで、翻訳するといったことにも使っています。東京都内の某店舗にご協力いただいて、絶賛実験中(NFCやQRも対応)です。インバウンド旅行者の方に商品を深く理解してもらいつつ、スタッフの方の働き方改革に役立てようというものです。
##ご注意
 動画を静止画にする方法なので、期待するほど美しくない場合があります。手振れの影響も大きいかもしれません。OCRには十分使えますが。

#大きな方針
・HTML5+Javascript+CSSでコーディング
・iPhone版Safariを使用(ChromeなどSafari以外のブラウザでは動かないようです。)
・少なくともiOS13系で動かす

#具体的にどうするの?
ずばり、HTML5のgetUserMedia()を使います。iPhoneのメインカメラで撮影する場合の例です。
インカメラを使いたい場合は、camera.jsの設定を
facingMode: 'environment', から
facingMode: 'user',
に変更してください。

index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8" />
  <title>CAMERA</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, shrink-to-fit=no" />
  <link rel="stylesheet" type="text/css" href="camera.css" />
</head>
<body>
  <div id="main">
    <button id="btn_shot" onclick="func_shot()">撮影</button>
    <div id="video_frame">
      <video id="video" autoplay playsinline></video>
      <script src="camera.js"></script>
      <canvas id="myCanvas"></canvas>
    </div>
  </div>
</body>
</html>
camera.js
const medias = {
	audio: false,
	video: {
    	facingMode: 'environment', //メインカメラ
		width: { min: 1024, ideal: 1920, max: 2436 },
		height: { min: 776, ideal: 1080, max: 1125 }
	}
};
const video = document.getElementById("video");
const promise = navigator.mediaDevices.getUserMedia(medias);

promise.then(function(stream){
	/* 成功 */
	video.srcObject = stream;
})
.catch(function(err) {
	/* エラーをハンドル */
});

function func_shot(){
	var canvas = document.getElementById('myCanvas');
	var ctx    = canvas.getContext('2d');
	var width  = video.offsetWidth;
	var height = video.offsetHeight;
	canvas.setAttribute('width' , width);
	canvas.setAttribute('height', height);
	ctx.drawImage(video, 0, 0, width, height);
	//画像をJPEGにしたいとき(これをformでPOSTしたりすればいいです)
	var imageData = canvas.toDataURL("image/jpg");
}
camera.css
#video{
	width: 100%;
}

これら3つのファイルをウェブサーバーにおいて、iPhoneのSafariでアクセスすると動画が表示されます。
「撮影」ボタンを押すと、動画の下に静止画が描画されます。
この静止画は、jpeg形式でimageDataに入れていますので、もしサーバーへ送りたければformに入れてPOSTすればいいです。
httpsにしないと動かないかもしれないのでその場合は、Let’s Encryptなどを使ってください。

#おわりに
そもそも、なぜHTML5でカメラが使えるのか?不思議に思われたかもしれません。一つの理由としては、WebRTC(Web Real-Time Communication)というリアルタイム通信(テレビ会議)を実現しようとして開発されたからです。ですので、そういう用途でも使えます。NAT越えとか大変そうですが・・・。

よいクリスマス&新年をお迎えください。
マハロ!

12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?