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

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

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

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

792閲覧

[android:kotlin]コンポジット合成の処理を速くしたい

kakikaki

総合スコア0

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/06/12 12:07

1.前提・実現したいこと

コンポジット合成の処理を速くしたいのですが、下記のソースコードで
実現ができたのですが、処理時間を短くしたいです。

2.ソースコード

kotlin

1//コンポジット合成 2 private fun composite(srcImg1 : Bitmap , srcImg2 : Bitmap) : Bitmap { 3 // 画像 4 var dstImg1 : Bitmap = Bitmap.createBitmap(srcImg1.width, srcImg1.height, Bitmap.Config.ARGB_8888) 5 6 // 高さ・幅 7 val width1 : Int = dstImg1.width 8 val height1 : Int = dstImg1.height 9 10 // 照度 11 var rgb1 : Int 12 var gray1 : Int 13 var rgb2 : Int 14 var gray2 : Int 15 16 // コンポジット合成 明るい方を採用 17 for(j in 0..height1 - 1 step 1) { 18 for (i in 0..width1 - 1 step 1) { 19 rgb1 = srcImg1.getPixel(i, j) 20 rgb2 = srcImg2.getPixel(i, j) 21 gray1 = (Color.red(rgb1) * 0.3 + Color.green(rgb1) * 0.59 + Color.blue(rgb1) * 0.11).toInt() 22 gray2 = (Color.red(rgb2) * 0.3 + Color.green(rgb2) * 0.59 + Color.blue(rgb2) * 0.11).toInt() 23 if (gray1 >= gray2){ 24 dstImg1.setPixel(i, j, Color.rgb(Color.red(rgb1), Color.green(rgb1), Color.blue(rgb1))) 25 }else{ 26 dstImg1.setPixel(i, j, Color.rgb(Color.red(rgb2), Color.green(rgb2), Color.blue(rgb2))) 27 } 28 } 29 } 30 return dstImg1 31 }

3.処理にかかる時間

端末1:P10
画像サイズ:6048 * 3402 = 20575296
処理時間:17984msec 約17秒 ※上記関数を挟んで時間を計測
ざっくり1ピクセルの処理にかかる時間: 0.874msec

端末2:oppo
画像サイズ:4608 * 2592 = 11943936
処理時間:14119msec 約14秒 ※上記関数を挟んで時間を計測
ざっくり1ピクセルの処理にかかる時間: 1.18msec

画像サイズ/処理時間で算出

4.質問

forで高さ方向、幅方向を回すので画像サイズが大きくなるとかなり時間がかかります。
この時間をできれば1/10に縮めたいと考えていますが、何か他の方法はないでしょうか?

###5.試したこと
他に方法が思いつかず、ネットで他の方法を探したのですが、見つけることができなく、
このサイトで質問です。

6.補足情報(FW/ツールのバージョンなど)

Android Studio 3.6.3
言語:kotlin
ベースにしたもの:Camera2Basic (kotlin)
端末1:P10
端末2:oppo A5 2020

最後に

何か情報をお持ちの方、またはこれ試して、などコメントを頂けると大変助かります。
よろしくお願いいたします。

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

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

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

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

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

kakikaki

2020/06/14 09:17

ご回答ありがとうございました。 教えて頂いたサイト見ました、とても参考になります。 このやり方を使ってやってみようと思います。 また、getPixels/setPixelsでgoogle検索でたくさん出てきたので 参考にしてみます。 ありがとうございました。
kakikaki

2020/06/17 09:54

hoshi-takanoriさん 教えて頂いたように、getPixels/setPixelsでやってみました。 途中つまらないところでつまづき2日棒に振りました。 まだ完全に詰め切れていませんが、速度を測ると1400msecとなり目標の1/10以下になりました。 ありがとうございました。
hoshi-takanori

2020/06/17 10:16

お疲れさまです。1400ms ってことは 1.4 秒、もう一声ってところでしょうか。でも、これ以上は NDK の出番なのかもしれませんね。
kakikaki

2020/06/17 12:39

hoshi-takanoriさん コメントありがとうございました。 細かいところなどを修正してプログラムが出来ました。何とかさらに短縮して、速度を測ると1200msec(1.2秒)となりました。
kakikaki

2020/06/17 12:44

すみません。 確認したいのですが、解決済みにするためには「質問に付いた回答の中から一番参考になった回答を選びベストアンサーボタンをクリックしてください。」と記載があるのですが、そのボタンが見当たりません。 また、最終的なコードも載せようと思ったのですが、自己解決の所に書けばいいのか?質問を編集して書けばいいのかどちらがいいのでしょうか? teratailの扱いに慣れていなく、回答よろしくお願いいたします。
hoshi-takanori

2020/06/17 19:50

解決した場合は「解決方法(自己解決の場合のみ記入してください)」欄にお書きください。
kakikaki

2020/06/18 08:42

hoshi-takanoriさん ご回答ありがとうございました。 今回は、自分で解決したわけではなく、hoshi-takanoriさんのアドバイスのおかげで解決したので、ベストアンサーとしたかったのですが、そのボタンが見つからなかったので質問させていただきました。 とても助かりました。
guest

回答1

0

自己解決

今回のコンポジット合成の内容です。
もし参考になればと思います。

kotlin

1 2 private fun composite2(srcImg1 : Bitmap , srcImg2 : Bitmap) : Bitmap { 3 // 出力画像用の配列 4 var dstImg1 : Bitmap = Bitmap.createBitmap(srcImg1.width, srcImg1.height, Bitmap.Config.ARGB_8888) 5 6 // 画像の高さ、幅、ピクセル 7 val width = dstImg1.width 8 val height = dstImg1.height 9 val psize = (width * height) 10 val pixels1 = IntArray(psize) //重要 LongArray 要素が width1 * height1 個の配列を作る 11 val pixels2 = IntArray(psize) //重要 LongArray 要素が width1 * height1 個の配列を作る 12 13 srcImg1.getPixels(pixels1,0,width,0,0,width,height) 14 srcImg2.getPixels(pixels2,0,width,0,0,width,height) 15 16 // コンポジット合成 17 for(i in 0..(psize - 1) step 1) { 18 var r_1 = (pixels1[i] shr 16) and 0xFF //右BITシフト shr 19 var g_1 = (pixels1[i] shr 8) and 0xFF //右BITシフト shr 20 var b_1 = (pixels1[i] ) and 0xFF //右BITシフト shr 21 var r_2 = (pixels2[i] shr 16) and 0xFF //右BITシフト shr 22 var g_2 = (pixels2[i] shr 8) and 0xFF //右BITシフト shr 23 var b_2 = (pixels2[i] ) and 0xFF //右BITシフト shr 24 25 var gray1 = ((r_1 * 0.3) + (g_1 * 0.59) + (b_1 * 0.11)).toInt() 26 var gray2 = ((r_2 * 0.3) + (g_2 * 0.59) + (b_2 * 0.11)).toInt() 27 28 if (gray1 >= gray2){ 29 pixels1[i]= pixels1[i] 30 }else{ 31 pixels1[i]= pixels2[i] 32 } 33 } 34 dstImg1.setPixels(pixels1,0,width,0,0,width,height) 35 return dstImg1 36 } 37

投稿2020/06/18 08:46

kakikaki

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問