PCスペック
Windows10 HOME 64bit
メモリ 32GB
プロセッサ Intel Core i7-8700CPU 3.20GHz
Android Studio 3.4.1(最新ver)
デモ用端末(XPERIA OS:7.0 API 24)
お世話になっております。
https://stackoverflow.com/questions/14801075/android-how-to-apply-mask-on-imageview
上記のサイトを参考に、mask処理で2枚の画像の重なる部分のみ抜き取りたいと思っています。
サイトの画像を用いたところmask処理はうまくいくのですが、
自分のアプリ内で入手した2枚の画像をmask処理にかけても、処理されずに終わってしまいます。
以下の自分が書いたソースコードの場合、mainImage(カメラで撮った画像)とmaskImage(指でなぞった部分の画像)をbitmapで読み込ませ、その後mask処理されたmainImageを表示するような想定で書いています。(要するに、カメラで撮った画像の中から、欲しい部分のみを「なぞって」抜き出すという機能を実装するということです)
しかし、button4を押して表示すると、なにも処理されていないmainImage(カメラで撮った方の画像)が表示されるだけです。
maskImageの方に何か原因があって上手くmask処理されていないということなのでしょうか。
ちなみに、maskImage(カメラで撮った画像)のサイズは、3840×2160で、maskImageのサイズは、1080×1212です。
サイズが合っていないと、mask処理はできないのでしょうか。
以下がそのソースコードです。
java
1 2 3//切り抜いた画像の表示 4 Button button4 = findViewById(R.id.button4); 5 button4.setOnClickListener(new View.OnClickListener() { 6 @Override 7 public void onClick(View v){ 8 InputStream inputStream0; 9 Canvas canvas = new Canvas(); 10 try{ 11 12 inputStream0 = new FileInputStream(file);//なぞった部分の画像データを読み込む 13 Bitmap maskImage = BitmapFactory.decodeStream(inputStream0);//bitmapとして取り出す 14 Bitmap mainImage = MediaStore.Images.Media.getBitmap(getContentResolver(),cameraUri);//カメラで撮った画像を読み込んでbitmapとして取り出す 15 Bitmap result = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888); 16 17 canvas.setBitmap(result); 18 Paint paint = new Paint(); 19 paint.setFilterBitmap(false); 20 21 canvas.drawBitmap(mainImage, 0, 0, paint); 22 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));//DST_INでmainImageがmaskImageに重なる部分のみを検出 23 canvas.drawBitmap(maskImage, 0, 0, paint); 24 paint.setXfermode(null); 25 26 imageView.setImageBitmap(result); 27 28 29 } catch (IOException e) { 30 e.printStackTrace(); 31 } 32 33 } 34 }); 35 36
ちなみに、maskImageの方は以下でアプリ内でjpeg画像として事前に用意したものを使用しています。
java
1//-- 切り抜き 2 Button button3 = findViewById(R.id.button3); 3 button3.setOnClickListener(new View.OnClickListener() { 4 @Override 5 public void onClick(View v){ 6 // 読み書きするファイル名を指定 7 file = new File(Environment.getExternalStorageDirectory().getPath() 8 + "/DCIM/Camera/" + "capture.jpeg"); 9 Log.d("debug","filePath = " + filePath); 10 // 指定したファイル名が無ければ作成する。 11 file.getParentFile().mkdir(); 12 13 switch(v.getId()) { 14 case R.id.button3: 15 // なぞった部分を撮る 16 saveCapture(findViewById(R.id.view),file); 17 break; 18 } 19 } 20 });
追記:
利用するmaskImageは以下のように塗った部分以外が黒で塗りつぶされている、という具合の画像です。
2つ目のソースコード(切り抜き)で、button3をクリックするとsaveCaptureで、なぞった部分のviewごと抜き取っているようです)
回答1件
あなたの回答
tips
プレビュー