質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

[Android Studio]ギャラリーから読み込んだ画像を加工したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,114

hum

score 10

以下の事が解決しません、どなたかご教示願います。

やりたいこと

①「読込」ボタンを押すとギャラリーを呼び出し、画像を読み込み表示する
②「処理」ボタンを押すと読み込んだ画像が加工処理され、表示される

できないところ

エミュレータは起動できた。
①はできた。
②のボタンを押した瞬間エラー表記が出てエミュレータが閉じる。
///画素読み込み/////のところのbmpにエラーが生じてしまい
解決できない。

ソースコード

public class MainActivity extends AppCompatActivity {

    private static final int RESULT_PICK_IMAGEFILE = 1000;
    ImageView imageView;

    int width;
    int height;
    Bitmap bmp = null;

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

        Button button = findViewById(R.id.button1);  //読込
        Button button2 = findViewById(R.id.button3); //処理開始

        Bitmap bmp = BitmapFactory.decodeResource(
                MainActivity.this.getResources(),
                R.drawable.gazou
        );

        ((ImageView) findViewById(R.id.imageView)).setImageBitmap(bmp);

////////////////////////////////////読み込みボタン/////////////////////////////////////////////////
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view1) {
                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                intent.setType("image/*");

                //onActivityResultを起動
                startActivityForResult(intent, RESULT_PICK_IMAGEFILE);

            }
        });
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



//////////////////////////////////////////処理開始ボタン////////////////////////////////////////////////////////////////////
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view2) {

            /////画素読み込み///////////////////////////////////////////
                width = bmp.getWidth();
                height = bmp.getHeight();
                //画像処理用配列
                int[] pixels = new int[width*height];
                //pixelsの配列にmyBitmapのデータを格納する
                bmp.getPixels(pixels, 0, width, 0, 0, width, height);
            ///////////////////////////////////////////////////////////

                //出力用画像領域確保
                Bitmap output=Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

         /////画像加工部分/////
                 //省略
         /////////////////////

                //出力用の領域にセットする
                output.setPixels(pixels, 0, width, 0, 0, width, height);

                ((ImageView) findViewById(R.id.imageView)).setImageBitmap(output);


            }
        });
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    }

///////////////////////////////////////////////画像読み込み処理///////////////////////////////////////////////////    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
        if (requestCode == RESULT_PICK_IMAGEFILE && resultCode == Activity.RESULT_OK) {
            if (resultData.getData() != null) {

                ParcelFileDescriptor pfDescriptor = null;
                try {
                    Uri uri = resultData.getData();
                    pfDescriptor = getContentResolver().openFileDescriptor(uri, "r");
                    if (pfDescriptor != null) {
                        FileDescriptor fileDescriptor = pfDescriptor.getFileDescriptor();
                        Bitmap bmp = BitmapFactory.decodeFileDescriptor(fileDescriptor);
                        pfDescriptor.close();

                        ((ImageView) findViewById(R.id.imageView)).setImageBitmap(bmp);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (pfDescriptor != null) {
                            pfDescriptor.close();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }
        }
    }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////    
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

0

すいません、やっと解決しました。
//画像処理用配列
int[] pixels = new int[width*height];
これの位置が悪かったみたいです。

widthとheightは宣言されているだけで何も値が入っていない所に
pixelsの宣言をしたのがダメみたいでした。

よって、int[] pixels = new int[width*height];の位置を
///処理開始ボタン///の
int width = bmp.getWidth();
int height = bmp.getHeight();
の次に置くことで正常に動作しました。

また、解決に伴い同じ悩みを抱える人のために、コピペで使えるよう
ソースコードを更新しました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

bmpはどこで初期化しているんですか?
していないならヌル参照例外で終了します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/05 17:57 編集

    申し訳ありません、ご容赦ください。
    ローカル変数とフィールド変数が同じ名前でも別のものということはわかります。
    起動してからエラー処理までで、このように表示されました。

    02-05 08:55:56.952 7059-7097/com.example.myapplication_test6 E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa29c2aa0
    02-05 08:56:05.237 7059-7059/com.example.myapplication_test6 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication_test6, PID: 7059 java.lang.ArrayIndexOutOfBoundsException
    at android.graphics.Bitmap.checkPixelsAccess(Bitmap.java:1444)
    at android.graphics.Bitmap.getPixels(Bitmap.java:1385)
    at com.example.myapplication_test6.MainActivity$3.onClick(MainActivity.java:113)
    at android.view.View.performClick(View.java:5198)
    at android.view.View$PerformClick.run(View.java:21147)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

    キャンセル

  • 2018/02/05 20:22

    このメッセージはなんと書いてありますか?

    キャンセル

  • 2018/02/06 17:48 編集

    エラーログの読み直し、
    各エラーを検索
    等行ってみましたがどうしても何が起きているのかわかりません…。
    唯一分かったことといえば
    ArrayIndexOutOfBoundsException
    →配列のインデックスとして存在しない要素を指定したエラー
    くらいです…。

    一応ソースコード更新しますね。

    更新個所として8行目に
    Bitmap bmp = null;
    と追加しました。
    私の見解では、フィールド変数 bmp に null;を入れていますので
    「読み込み」ボタンを押すことで///画像読み込み処理///内でbmpに画像データが保存され
    「処理開始」ボタンを押すことで///処理開始ボタン///内でbmpの画像サイズやpixel情報を
    取得でき、処理できるものと考えています。

    キャンセル

0

Android SDK: Displaying Images with an Enhanced Gallery
Step 1: Create an Android Project.
Step 2: Design the App. 
Step 3: Create a Base Adapter. 
Step 4: Allow the User to Choose Images. 
Step 5: Handle Returned Images.

https://www.youtube.com/watch?v=_xIWkCJZCu0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる