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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

1回答

3635閲覧

Android mask処理で2枚の画像の重なる部分のみ抜き取りたい

sekaikan_ozaki

総合スコア65

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2019/06/12 02:40

編集2019/06/12 05:25

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ごと抜き取っているようです)
イメージ説明

ちなみに以下は、参考サイトにあったサンプルのmask画像で緑のmaskの周りは、透明のようです。
イメージ説明

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

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

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

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

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

jimbe

2019/06/12 05:06

maskImage のマスクで無い部分は透明になっているでしょうか.
sekaikan_ozaki

2019/06/12 05:26

jimbe様お久しぶりです! >maskImage のマスクで無い部分は透明になっているでしょうか. いいえ、マスク以外の部分は、黒色で塗りつぶされています。 イメージ画像を、質問の方に追加編集させていただきましたので、ご確認いただければ幸いです。
guest

回答1

0

ベストアンサー

PorterDuff.Mode.DST_IN は「マスクの"透明で無い"部分の元画像を取り出す」ものだったと思いますので, マスクに透明部分が無ければ, 結果は元画像そのままになるのではないでしょうか.

投稿2019/06/12 05:31

jimbe

総合スコア12648

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

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

sekaikan_ozaki

2019/06/12 05:58

そういうことだったんですね...! PorterDuff.Mode.DST_INの定義をその部分まで知っていなかったので、大変参考になりました。 ということは、maskImageの黒色で塗りつぶされた部分を透明に変えることさえ出来れば、正常にPorterDuff.Mode.DST_INが使えるということだと理解しました。 なので、まずは、mask画像のマスク以外を透明にできるようにしてみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問