3

ビットマップを含む ImageView があります。このビットマップには、アルファ チャネルと透明ピクセルがあります。Mode.OVERLAY (ハニカム以降) で ColorFiter を使用しようとすると、画像ビュー全体 (四角形全体) にカラー オーバーレイが提供されますが、透明でないピクセルのみをオーバーレイしたいです。イメージビューのキャンバスをクリップして、必要な場所でフィルターを実行するにはどうすればよいですか?

更新しました

私はpngに灰色の画像を持っています:

ここに画像の説明を入力

MODE_ATOP を使用しようとすると、次のようになります。

ここに画像の説明を入力

OVERLAY を使用すると、次のようになります。

ここに画像の説明を入力

そして、私が取得したいもの:

ここに画像の説明を入力

4

2 に答える 2

3

これを行うにはもっと効率的な方法がおそらくありますが (おそらくColorMatrixColorFilter近似するために を作成することによって)、それ以外の場合は単純化するのが難しいMode.OVERLAYように思われるため、必要なものを実装する必要があるサンプル コードを次に示します。

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final ImageView imageView = new ImageView(this);
        setContentView(imageView);

        final Paint paint = new Paint();
        Canvas c;

        final Bitmap src = BitmapFactory.decodeResource(getResources(),
                android.R.drawable.sym_def_app_icon);
        final int overlayColor = Color.RED;

        final Bitmap bm1 = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Config.ARGB_8888);
        c = new Canvas(bm1);
        paint.setColorFilter(new PorterDuffColorFilter(overlayColor, PorterDuff.Mode.OVERLAY));
        c.drawBitmap(src, 0, 0, paint);

        final Bitmap bm2 = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Config.ARGB_8888);
        c = new Canvas(bm2);
        paint.setColorFilter(new PorterDuffColorFilter(overlayColor, PorterDuff.Mode.SRC_ATOP));
        c.drawBitmap(src, 0, 0, paint);

        paint.setColorFilter(null);
        paint.setXfermode(new AvoidXfermode(overlayColor, 0, Mode.TARGET));
        c.drawBitmap(bm1, 0, 0, paint);

        imageView.setImageBitmap(bm2);
    }

}

つまり、モードを使用してソース ビットマップと色を描画し、OVERLAY次に (モードを使用して合成された) セカンダリ ビットマップを使用して、透明なピクセルの上に描画しないSRC_ATOPように組み合わせます。AvoidXfermode

元の画像:

元の画像

結果:

結果

于 2012-08-22T16:32:44.023 に答える