(44) カメラで撮影した画像データを取得する。

投稿者: | 2023年3月17日

240 views

この記事は最終更新から 431日 が経過しています。

1. やりたいこと

自作の Androidアプリの中でカメラを起動して写真撮影し、そのデータを取得&自由に処理したい。
メモリ上の Bitmapデータとして取得できるそうなので、これをやってみたい。

2. やってみる

(1) AndroidManifest.xml

カメラの使用許可設定をする。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.CAMERA" />
    <queries>
        <intent>
            <action android:name="android.media.action.IMAGE_CAPTURE" />
        </intent>
    </queries>
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"

(2) MainActivity.java #1 カメラ起動ボタンを押下時の処理

※actResultLauncher は後述する。

    public void onPushCameraButton(View view){
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        actResultLauncher.launch(intent);
    }

(3) MainActivity.java #2 カメラ撮影完了時の処理

※saveImage は後述する。

    private final ActivityResultLauncher<Intent> actResultLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == Activity.RESULT_OK) {
                    Intent data = result.getData();
                    if(data != null) {
                        // 撮影した画像データを Bitmapで取得する。
                        Bundle extras = data.getExtras();
                        bmpImg = (Bitmap)extras.get("data");
                        // 撮影した画像データを画面上に表示する。
                        ImageView iv = findViewById(R.id.iv_pic);
                        iv.setImageBitmap(bmpImg);
                        // 撮影した画像データをファイルに保存する。
                        saveImage(bmpImg);
                    }
                }
            });

(4) MainActivity.java #3 Bitmapデータを画像ファイル保存する処理

    private void saveImage(Bitmap bitmap) {
        // アプリ専用の内部ストレージのディレクトリに画像ファイルを保存する。
        File appDir = getFilesDir();
        String filePath = String.format("%s/myimg.jpg", appDir.toString());
        // ファイルオープンし、JPEG最高品質(100)で画像ファイル出力する。
        try(FileOutputStream fos = new FileOutputStream(new File(filePath))){
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

(5) MainActivity.java #4 画像ファイルをロードし、ImageViewに表示する。

    private void loadImageToView(){
        // アプリ専用の内部ストレージのディレクトリ内の画像ファイル名を作成
        File appDir = getFilesDir();
        String filePath = String.format("%s/myimg.jpg", appDir.toString());
        // Bitmapオプションを設定
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        // 画像ファイルを Bitmapで読み出す。
        Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
        // Bitmap画像データを ImageViewに表示する。
        ImageView iv = findViewById(R.id.iv_pic);
        iv.setImageBitmap(bitmap);
    }

3. 付録 : 動作確認済みの全コードは以下の通り。

package com.example.testcamera;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;

import java.io.File;
import java.io.FileOutputStream;

public class MainActivity extends AppCompatActivity {
    private Bitmap bmpImg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        loadImageToView();
    }

    public void onPushCameraButton(View view){
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        actResultLauncher.launch(intent);
    }

    private final ActivityResultLauncher<Intent> actResultLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == Activity.RESULT_OK) {
                    Intent data = result.getData();
                    if(data != null) {
                        // 撮影した画像データを Bitmapで取得する。
                        Bundle extras = data.getExtras();
                        bmpImg = (Bitmap)extras.get("data");
                        // 撮影した画像データを画面上に表示する。
                        ImageView iv = findViewById(R.id.iv_pic);
                        iv.setImageBitmap(bmpImg);
                        // 撮影した画像データをファイルに保存する。
                        saveImage(bmpImg);
                    }
                }
            });

    private void saveImage(Bitmap bitmap) {
        // アプリ専用の内部ストレージのディレクトリに画像ファイルを保存する。
        File appDir = getFilesDir();
        String filePath = String.format("%s/myimg.jpg", appDir.toString());
        // ファイルオープンし、JPEG最高品質(100)で画像ファイル出力する。
        try(FileOutputStream fos = new FileOutputStream(new File(filePath))){
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void loadImageToView(){
        // アプリ専用の内部ストレージのディレクトリ内の画像ファイル名を作成
        File appDir = getFilesDir();
        String filePath = String.format("%s/myimg.jpg", appDir.toString());
        // Bitmapオプションを設定
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        // 画像ファイルを Bitmapで読み出す。
        Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
        // Bitmap画像データを ImageViewに表示する。
        ImageView iv = findViewById(R.id.iv_pic);
        iv.setImageBitmap(bitmap);
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)