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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

6028閲覧

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

hum

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

2クリップ

投稿2018/02/03 11:21

編集2018/02/08 08:21

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

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

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

##ソースコード

java

1public class MainActivity extends AppCompatActivity { 2 3 private static final int RESULT_PICK_IMAGEFILE = 1000; 4 ImageView imageView; 5 6 int width; 7 int height; 8 Bitmap bmp = null; 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_main); 14 15 Button button = findViewById(R.id.button1); //読込 16 Button button2 = findViewById(R.id.button3); //処理開始 17 18 Bitmap bmp = BitmapFactory.decodeResource( 19 MainActivity.this.getResources(), 20 R.drawable.gazou 21 ); 22 23 ((ImageView) findViewById(R.id.imageView)).setImageBitmap(bmp); 24 25////////////////////////////////////読み込みボタン///////////////////////////////////////////////// 26 button.setOnClickListener(new View.OnClickListener() { 27 @Override 28 public void onClick(View view1) { 29 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 30 intent.addCategory(Intent.CATEGORY_OPENABLE); 31 intent.setType("image/*"); 32 33 //onActivityResultを起動 34 startActivityForResult(intent, RESULT_PICK_IMAGEFILE); 35 36 } 37 }); 38///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 39 40 41 42//////////////////////////////////////////処理開始ボタン//////////////////////////////////////////////////////////////////// 43 button2.setOnClickListener(new View.OnClickListener() { 44 @Override 45 public void onClick(View view2) { 46 47 /////画素読み込み/////////////////////////////////////////// 48 width = bmp.getWidth(); 49 height = bmp.getHeight(); 50 //画像処理用配列 51 int[] pixels = new int[width*height]; 52 //pixelsの配列にmyBitmapのデータを格納する 53 bmp.getPixels(pixels, 0, width, 0, 0, width, height); 54 /////////////////////////////////////////////////////////// 55 56 //出力用画像領域確保 57 Bitmap output=Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 58 59         /////画像加工部分///// 60  //省略 61         ///////////////////// 62 63 //出力用の領域にセットする 64 output.setPixels(pixels, 0, width, 0, 0, width, height); 65 66 ((ImageView) findViewById(R.id.imageView)).setImageBitmap(output); 67 68 69 } 70 }); 71///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 72 73 } 74 75///////////////////////////////////////////////画像読み込み処理/////////////////////////////////////////////////// 76 @Override 77 public void onActivityResult(int requestCode, int resultCode, Intent resultData) { 78 if (requestCode == RESULT_PICK_IMAGEFILE && resultCode == Activity.RESULT_OK) { 79 if (resultData.getData() != null) { 80 81 ParcelFileDescriptor pfDescriptor = null; 82 try { 83 Uri uri = resultData.getData(); 84 pfDescriptor = getContentResolver().openFileDescriptor(uri, "r"); 85 if (pfDescriptor != null) { 86 FileDescriptor fileDescriptor = pfDescriptor.getFileDescriptor(); 87 Bitmap bmp = BitmapFactory.decodeFileDescriptor(fileDescriptor); 88 pfDescriptor.close(); 89 90 ((ImageView) findViewById(R.id.imageView)).setImageBitmap(bmp); 91 } 92 } catch (IOException e) { 93 e.printStackTrace(); 94 } finally { 95 try { 96 if (pfDescriptor != null) { 97 pfDescriptor.close(); 98 } 99 } catch (Exception e) { 100 e.printStackTrace(); 101 } 102 } 103 104 } 105 } 106 } 107///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 108}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

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

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

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

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

投稿2018/02/08 08:20

編集2018/02/08 08:22
hum

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2018/02/03 11:52

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hum

2018/02/04 07:07 編集

いろいろ試行錯誤してみたのですが、どこで初期化をすればいいのかわからない状態です…。 /////画像読み込み処理///// で読み込んだ画像データを int width; int height; int[] pixels = new int[width*height]; に与えて、加工したいのですが全然うまくいきません…。 もう少し詳しく教えていただけませんか? お忙しい中すいません。
yona

2018/02/04 07:48

フィールド変数やローカル変数について理解していますか?
hum

2018/02/04 10:03

フィールド変数はメソッド内からアクセスできて ローカル変数はメソッド内でのみアクセスできる という認識でいます。
yona

2018/02/04 11:57

では変数bmpはなんでしょうか。
hum

2018/02/05 01:44

ローカル変数になっていたので 上から10行目にBitmap bmp = null;を置いたら エミュレータを起動して画像の読み込みまでできました。 ありがとうございます。 しかし、処理画像ボタンを押すとエラーが発生してしまい、エミュレータが強制終了してしまいました。 色々試行錯誤してみましたが、どうしてもうまくいきません…。 /////画素読み込み/////////////////////////////////////////// int width = bmp.getWidth(); int height = bmp.getHeight(); //pixelsの配列にmyBitmapのデータを格納する bmp.getPixels(pixels, 0, width, 0, 0, width, height); /////////////////////////////////////////////////////////// ここのbmp読み込みに問題があるのでしょうか…?
yona

2018/02/05 03:37

Javaの理解度に問題があるようです。 ローカル変数とフィールド変数は同じ名前でも別物ということはわかりますか? また、「エラーで終了します」ではわかりません。エラーログを載せてください。
hum

2018/02/05 10:13 編集

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

2018/02/05 11:22

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

2018/02/06 08:59 編集

エラーログの読み直し、 各エラーを検索 等行ってみましたがどうしても何が起きているのかわかりません…。 唯一分かったことといえば ArrayIndexOutOfBoundsException →配列のインデックスとして存在しない要素を指定したエラー くらいです…。 一応ソースコード更新しますね。 更新個所として8行目に Bitmap bmp = null; と追加しました。 私の見解では、フィールド変数 bmp に null;を入れていますので 「読み込み」ボタンを押すことで///画像読み込み処理///内でbmpに画像データが保存され 「処理開始」ボタンを押すことで///処理開始ボタン///内でbmpの画像サイズやpixel情報を 取得でき、処理できるものと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問