カメラ・プラグインの利用

ここでは Ionic アプリケーションから写真を撮影して、ページに取り込む方法を説明します。

また撮影した画像を端末に保存する方法も紹介します。

このページのサンプルでは、次のように撮影を開始(カメラを起動)するボタンがあり・・・

ボタンを押すとカメラが起動して撮影できます。撮影した内容について Confirm (確認) とすると・・・

元の画面に戻りますが、このときに撮影した画像がページに表示されます。

これを実現する方法を以下に示します。

カメラプラグインの利用

ページの作成とプラグインの追加

ここでは camera1 というプロジェクトを作成して、cameraPage というカメラを起動するページを作成します。 さらに、カメラを利用するためのプラグイン cordova-plugin-camera も追加します。

全体的な流れは「バーコードスキャナプラグインの利用」と同様です。

$ ionic start camera1 blank --v2
$ cd camera1
$ ionic platform add android
$ ionic g page cameraPage
$ ionic plugin add cordova-plugin-camera
$ npm install --save @ionic-native/camera

ポイントとなる src/pages/camera-page フォルダ以下について、以下にコードを示します。 CameraPageModule モジュールを AppModule に取り込むなどの箇所は省略しますので、不明点があったら 「バーコードスキャナプラグインの利用」などを参考にしてください。

ページテンプレート src/pages/camera-page/camera-page.html は以下の通りです。

<ion-header>
  <ion-navbar>
    <ion-title>Camera Sample</ion-title>
  </ion-navbar>
</ion-header>
<ion-content padding>
  <button ion-button (click)="takePicture()">Take a picture</button>
  <div *ngIf="imgSrc">
    <img src="{{imgSrc}}" alt="" class="img-taken">
  </div>
</ion-content>

カメラページのコード src/pages/camera-page/camera-page.ts は次の通り。

import { Component } from '@angular/core';
import { IonicPage } from 'ionic-angular';
import { Camera, CameraOptions } from '@ionic-native/camera';

@IonicPage()
@Component({
  selector: 'page-camera-page',
  templateUrl: 'camera-page.html',
  providers: [ Camera ],
})
export class CameraPage {

  imgSrc: string;

  constructor( private camera: Camera ) {
  }

  ionViewDidLoad() {
    console.log('ionViewDidLoad CameraPage');
  }

  takePicture(){
    const options: CameraOptions = {
      quality: 75,
      destinationType: this.camera.DestinationType.DATA_URL,
      encodingType: this.camera.EncodingType.JPEG,
      mediaType: this.camera.MediaType.PICTURE
    };

    this.camera
      .getPicture(options)
      .then((imageData)=>{
        let base64Image = 'data:image/jpeg;base64,' + imageData;
        this.imgSrc = base64Image;
      })
      .catch((err)=>{
        console.log(err);
      });
  }

}

撮影した画像を img に単純に設定するとサイズが大きすぎてはみ出るので、CSS クラスを設定しています。

せっかくなので SCSS 的に幅をパラメータ化して書いてみましょう。

$image-width: 95%;

.img-taken {
  max-width: $image-width;
}

念のため CSS が正しく生成されたかデバッガで確認すると次のように、確かに 95% が max-width に設定されていることが確認できます。

上記によって、Take a Picture ボタンを押しカメラを起動したのち、Confirm (確認) を押すと、ページ内の img タグに写真がセットされます。

撮影した画像ファイルを保存

さらに上記で撮影した画像をギャラリに保存してみましょう。

撮影されたデータは Base64 で受けとります。Base64 データをギャラリに保存するためのプラグインである、 その名も Base64 To Gallery をインストールします。

$ ionic plugin add cordova-base64-to-gallery
$ npm install --save @ionic-native/base64-to-gallery

尚、このプラグインは PNG 形式での保存のみをサポートしていたので、JPEG 保存のため少しだけ改造して使いました。ここでは Android のみをプラットフォームとしています。

この辺はドキュメントされたものでもないので、適当に状況に応じて変更してください。参考までに変更箇所を載せておきます。

カメラページでは次のように DI で Base64ToGallery のオブジェクトを受け取り、

import { Component } from '@angular/core';
import { IonicPage } from 'ionic-angular';
import { Camera, CameraOptions } from '@ionic-native/camera';
import { Base64ToGallery } from '@ionic-native/base64-to-gallery';

@IonicPage()
@Component({
  selector: 'page-camera-page',
  templateUrl: 'camera-page.html',
  providers: [ Camera, Base64ToGallery ],
})
export class CameraPage {

  imgSrc: string;

  constructor(
    private camera: Camera,
    private base64ToGallery: Base64ToGallery ) {
  }

  ionViewDidLoad() {
    console.log('ionViewDidLoad CameraPage');
  }

  takePicture(){
    const options: CameraOptions = {
      quality: 75,
      destinationType: this.camera.DestinationType.DATA_URL,
      encodingType: this.camera.EncodingType.JPEG,
      mediaType: this.camera.MediaType.PICTURE
    };

    this.camera
      .getPicture(options)
      .then((imageData)=>{
        let base64Image = 'data:image/jpeg;base64,' + imageData;
        this.imgSrc = base64Image;

        // 画像を保存
        this.base64ToGallery.base64ToGallery(
          imageData,
          {prefix: 'myimg_'}
        )
        .then((res)=>{
          console.log(`OK - ${res}`);
        })
        .catch((err)=>{
          console.log(`Error ${err}`);
        });

      })
      .catch((err)=>{
        console.log(err);
      });
  }

}

base64ToGallery というメソッドを呼ぶだけなので簡単ですね。

以上で、カメラプラグインを利用して画像を HTML に取り込む方法、及び、アンドロイド端末内に画像を保存する方法を示しました。