質問
Android(1.5)で作業すると、バイト配列の形で100個ほどのグレースケール画像があります。画像をアルファマスクとして使用して、キャンバスに固体色を描くために使用したいと思います。画像は固定されていますが、色が変わる可能性があります。画像/色の組み合わせごとにビットマップオブジェクトを作成できますが、それはひどく非効率的です。メモリと速度の両方の点で、この問題にアプローチする良い方法は何でしょうか? (各画像/カラーコンボに対してこれを何度も行う必要があります。)
解決
私は探していた答えを見つけたと思います:
- 各ピクセルの色が(灰色<< 24)に設定されているargb_8888ビットマップを作成します| 0xffffff。
- 各色について、新しいPorterduffColorfilter(Color、PorterDuff.Mode.Multiply)を作成します。
- レンダリングするには、ペイントオブジェクトを作成し、使用する色に対応するフィルターでsetColorfilter()を呼び出します。次に、ビットマップとペイントオブジェクトを使用してCanvas.drawbitmapを呼び出します。
シングルカラーの場合、これはおそらく、ペイントオブジェクトなしで私が望むビットマップと描画を正確に構築するほど高速ではありませんが、各画像/カラーコンボのビットマップよりもはるかにスペース効率が高くなります。
他のヒント
フロートコントラスト= 100/180.f;フロートスケール=コントラスト + 1.F;
cm.set(new float[] {
scale, 0, 0, 0, 0,//Red
0, 1.5f, 0, 0, 0,//Green
0, 0, 1.5f, 0, 0,//Blue
0, 0, 0, 1, 0 });//alpha
bmpGrayscale = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
paint.setColorFilter(f);
c.drawBitmap(bitmap, 0, 0, paint);
/*BitmapDrawable bmd = new BitmapDrawable(bmpGrayscale);
photo_view.setBackgroundDrawable(bmd);*/
photo_view.setImageBitmap(bmpGrayscale);
私は使うだろう drawImage
画像をキャンバスに促進するには、 getImageData()
ピクセルにアクセスしてから、 .data
画像データのうち、各ピクセルのRGB値を定数に設定し、4番目(アルファ)値を画像から得たものに設定します。その後、この半透明のキャンバスを必要なものに重ねることができます。
編集: :私は置いた 作業例 これの私のウェブサイトで。 Chrome/Safariでのみ動作します。
所属していません StackOverflow