LoginSignup
3
0

More than 3 years have passed since last update.

Androidアプリで端末の画像を取り込む

Last updated at Posted at 2019-12-17

はじめに

AndroidStudioのデフォルトだけで完結するアプリ作りにも飽きてきたので、OpenCVを使って画像を色々編集できるようにしてアプリの幅を広げてみる。
はじめに編集するための画像をデバイスから取り込む。

環境

OpenCV 4.1.2
AndroidStudio 3.4.1

画像を取り込む

公式ドキュメントがこちら

まずは適当にベースとなるコードを書く。
いまだにGUIでレイアウト画面作るの慣れていないのでxmlで書いちゃう派です。

MainActivity.java
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    Button btn_import;
    ImageView img_picture;

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

        btn_import = findViewById(R.id.btn_import);
        img_picture = findViewById(R.id.img_picture);
    }

    @Override
    protected void onStart() {
        super.onStart();
        btn_import.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //ここに画像を取り込む処理を書く
            }
        });
    }
}

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_import"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:text="Import"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginTop="40dp"
        android:layout_marginStart="40dp"/>

    <ImageView
        android:id="@+id/img_picture"
        android:layout_width="320dp"
        android:layout_height="500dp"
        app:layout_constraintTop_toBottomOf="@id/btn_import"
        app:layout_constraintStart_toStartOf="@id/btn_import"/>

</android.support.constraint.ConstraintLayout>

取り込む方法として、以下2つのインテントのどちらかを利用すればOKとのこと。

  • ACTION_OPEN_DOCUMENT
  • ACTION_CREATE_DOCUMENT

写真編集アプリなどを作る時はCREATEを推奨と書いてあったので、ACTION_CREATE_DOCUMENTを利用
保存とかせずにその場で編集するだけであればACTION_OPEN_DOCUMENTの方が適していた。

取り込み処理を実装

OnClick部分だけ抜粋

MainActivity.java
public void onClick(View v) {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("image/*");
    startActivityForResult(intent, READ_REQUEST_CODE);  //READ_REQUSET_CODE = 42
}

これでボタンを押すとピッカーが立ち上がり、画像を選択できる。
画像を選択すると、onActivityResult()が呼ばれる。
このonActivityResult()内で画像を参照するためのURIが入手できる。
今回はURIからbitmapを取得し、画像を表示する。

MainActivity.java
@Override
public void onActivityResult(int requestCode, int resultCode,
                             Intent resultData) {
    if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        Uri uri = null;
        if (resultData != null) {
            uri = resultData.getData();//画像データのuri
            try {
                Bitmap bmp = getBitmapFromUri(uri);
                img_picture.setImageBitmap(bmp);
            }catch(IOException e){
                //TODO:例外処理
            }
        }
    }
}

//公式Docからそのまま転用
private Bitmap getBitmapFromUri(Uri uri) throws IOException {
    ParcelFileDescriptor parcelFileDescriptor =
            getContentResolver().openFileDescriptor(uri, "r");
    FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
    Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
    parcelFileDescriptor.close();
    return image;
}

おわり

これでボタンを押して、本体から画像を選択し、表示するまでの流れができた。
次はこの取り込んだ画像をOpenCVで色々いじって見たりしたいと思います。

3
0
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
3
0