2010-12-15 12 views
4

Android(1.5)で作業していますが、バイト配列の形で100以上のグレースケール画像があります。 Canvasで単色を描画するためのアルファマスクとして画像を使用したいと思います。画像は固定されていますが、色は変わります。各画像/カラーの組み合わせに対してビットマップオブジェクトを作成できますが、それはひどく非効率です。メモリとスピードの両方に関して、この問題にアプローチするにはどうすればよいでしょうか? (Iは各画像/カラーコンボこの何回も行う必要がある。)アルファマスクの色付け方法

答えて

4

  1. は、各ピクセルの色が(< < 24灰色)に設定されているARGB_8888ビットマップを作成| 0xFFFFFF。
  2. 各色について、新しいPorterDuffColorFilter(color、PorterDuff.Mode.MULTIPLY)を作成します。
  3. レンダリングするには、Paintオブジェクトを作成し、使用する色に対応するフィルタでsetColorFilter()を呼び出します。その後、BitmapおよびPaintオブジェクトを使用してcanvas.drawBitmapを呼び出します。

単色の場合、これは、私が望むビットマップを正確に構築し、ペイントオブジェクトなしで描画するほど高速ではないかもしれませんが、イメージ/カラーコンボごとにビットマップよりもはるかに効率的です。

0

IピクセルにアクセスするgetImageData()、キャンバスに画像をブリットするdrawImageを使用し、その後、画像データの.dataをループ、設定なります各ピクセルのRGB値を定数に、4番目の値(アルファ)を​​画像から取得した値に置き換えます。この半透明のキャンバスは、必要な部分に重ねて表示できます。

を編集してください:a working exampleを私のウェブサイトに掲載しました。 Chrome/Safariでのみ動作します。私は私が探していた答え見つけたと思う

+0

私はこのようなことをしていました。私が完全に説明していなかった問題は、各イメージを何度もキャッシュして再利用できるソリューションが必要だということです。私は、必要なときにイメージを再生成する余裕がなく、必要な各色のイメージをキャッシュする余裕がありません。 –

+0

@TedHoppあなたは解決策がありがとうございます。しかし、上記の私のソリューションは、色ごとのバリエーションをキャッシュせずに画像データをキャッシュします。画像データは(window.onload'の中の115行目)一度だけロードされ、(updateColor()の一部として)スライダを更新するたびに色ごとのバリエーションが再作成されることに注意してください。 – Phrogz

+0

私が避けようとしていたのは、色ごとのバリエーションごとに新しい画像を生成することでした。 Porter-Duffカラーフィルターはまさにこれを行うようです。 –

1

float contrast = 100/180.f; float scale = contrast + 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); 
関連する問題