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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

1回答

1456閲覧

Android mask処理でPorterDuff.Mode.XORができない

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 08:55

編集2019/06/13 07:05

PCスペック
Windows10 HOME 64bit
メモリ 32GB
プロセッサ Intel Core i7-8700CPU 3.20GHz
Android Studio 3.4.1(最新ver)
デモ用端末(XPERIA OS:7.0 API 24)

お世話になっております。

1つ前の質問の内容の続きなのですが、
maskをかける側の画像の背景が透明ではないことが原因で、mask処理ができていいませんでした。

そこで、maskをかける側の画像の背景を透明するための方法として、以下を考えました。

方法
手順1:「画像1(手順3でmaskをかける側になる画像)」と「画像2(手順2でmaskをかける側の真っ黒な画像)」を用意する
手順2:手順1の2枚で排他的論理和(PorterDuff.Mode.XOR)のmask処理を行い、2枚の画像の重なる部分だけを透明にすることで、画像1を「ピンクの線のみで残りを透明」という画像に変える
手順3:「変更後の画像1」と「本来用意していた画像」とで、PorterDuff.Mode.DST_INを用いてマスク処理をかけて、重なる部分のみを抽出する

画像1:マスクをかける画像
イメージ説明

画像2:真っ黒な画像
イメージ説明

現在困っていること
手順2が終了した時点でアプリ上では、思い通りピンクの線が表示されて、周りが白く(透明だということ)なっていた。
しかし、手順3が終了して、得られた画像は真っ白な画像になっている。。
↑これが原因不明ということでなんとか解決したいです。

6/13追記
>手順2が終了した時点でアプリ上では、思い通りピンクの線が表示されて、周りが白く(透明だということ)なっていた。
アプリ画面上では、そのようなImageViewとして表示されていたが、実際に「変更後の画像1(maskImage)」をストレージに保存して確認してみると、真っ黒の画像になっていた。

>しかし、手順3が終了して、得られた画像は真っ白な画像になっている。
こちらもアプリ画面上でこのように見えたが、手順3が終了した時点での「最終的な画像(resultImage)」も念のためストレージに保存して確認してみると、真っ黒な画像になっていた。

ソースコードを以下に載せておきます。

java

1 //切り抜いた画像の表示 2 Button button4 = findViewById(R.id.button4); 3 button4.setOnClickListener(new View.OnClickListener() { 4 @Override 5 public void onClick(View v){ 6 7 InputStream inputStream0; 8 Canvas canvas = new Canvas(); 9 try{ 10 11 inputStream0 = new FileInputStream(file);//なぞった部分の画像データを読み込む 12 13 Bitmap nazoruImage = BitmapFactory.decodeStream(inputStream0);//bitmapとして取り出す 14 Bitmap blackImage = BitmapFactory.decodeResource(getResources(), R.drawable.black);//bitmapとして取り出す 15 16//手順1終わり 17 18 Bitmap maskImage = Bitmap.createBitmap(nazoruImage.getWidth(), nazoruImage.getHeight(), Bitmap.Config.ARGB_8888); 19 20 canvas.setBitmap(maskImage); 21 Paint blackClearPaint = new Paint(); 22 blackClearPaint.setFilterBitmap(false); 23 24 canvas.drawBitmap(nazoruImage, 0, 0, blackClearPaint); 25 blackClearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR)); 26 canvas.drawBitmap(blackImage, 0, 0, blackClearPaint); 27 blackClearPaint.setXfermode(null); 28 29 //imageView.setImageBitmap(maskImage);//手順2終わり、ここでは期待通りのXORができている思っていたが、そうではないのかもしれない 30 31 Bitmap mainImage = MediaStore.Images.Media.getBitmap(getContentResolver(),cameraUri);//カメラで撮った画像を読み込んでbitmapとして取り出す 32 Bitmap resultImage = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888); 33 34 canvas.setBitmap(resultImage); 35 Paint commonShowPaint = new Paint(); 36 commonShowPaint.setFilterBitmap(false); 37 38 canvas.drawBitmap(mainImage, 0, 0, commonShowPaint); 39 commonShowPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); 40 //commonShowPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 41 canvas.drawBitmap(maskImage, 0, 0, commonShowPaint); 42 commonShowPaint.setXfermode(null); 43 44 imageView.setImageBitmap(resultImage);//表示されたのは、真っ白な画像で???状態、ストレージで確認すると真っ黒な画像になっている 45 46 47 } catch (IOException e) { 48 e.printStackTrace(); 49 } 50 } 51 }); 52

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

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

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

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

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

jimbe

2019/06/13 09:40

透明の確認ですが, 「ストレージに保存して確認」は jpeg でされたのでしょうか. jpeg は透明度の保存は無かったように思うのですが... png での保存では如何でしょう.
sekaikan_ozaki

2019/06/14 02:21

保存はすべてjpegでした。 提案していただきました、pngで保存して確認すると、透明な部分が表示されました! 色々コードを改良してみましたところ、なぞった部分だけ抽出することができましたので、自己解決の方にまとめさせていただきます。 jimbe様のおかげで、大きな1歩を進めました。ありがとうございました。
guest

回答1

0

自己解決

「ストレージに保存して確認」の部分では、jpeg形式で保存していたので、透明度が考慮されていなかったと考えられた。
そこで、透明度の情報を持つことができるpng形式に変えたところう上手くいきました。
なので、なぞった画像(画像1)がすでにpngで用意することができたので、マスク画像としてそのまま、画像3とのPorterDuff.Mode.DST_INを実現することができました。

投稿2019/06/14 02:24

sekaikan_ozaki

総合スコア65

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問