0

次の画像があります。

ここに画像の説明を入力

ここで、実行時にこの画像をさまざまな色にフィルター処理したいと思います。たとえば、下の部分が濃い緑で、左上の部分が明るい緑である緑のバージョンを生成できるようにしたいと考えています。

これどうやってするの?これは可能ですか?

次のようにビットマップをフィルタリングしてみました。

private static Bitmap applyColorFilter(Bitmap source, int color) {

    Bitmap empty = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight());
    Canvas c = new Canvas(empty);
    Paint p = new Paint();

    PorterDuffColorFilter pdcf = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN);
    p.setColorFilter(pcdf);
    c.drawBitmap(empty, 0, 0, p);
    source.recycle();
    return empty;
}

すべてのを試しPorterDuff.Modeましたが、どれも実際には機能しません。ときどき (例: SRC_IN) 円が完全に新しい色で塗りつぶされ、陰影がまったくないことがあります。それ以外の場合は、正方形が表示されます。

色自体を持たないソース イメージを生成し、そのシェーディングをアルファ チャネルでレンダリングすることを考えました。しかし、それがうまくいくかどうかはわかりません。結果の画像を完全に不透明にしたい(上に表示されている外側の影を除く)。

4

1 に答える 1

0

を使用して解決策を見つけましたColorMatrixColorFilter

// Take values from the destination color
int destA = (color >> 24);
int destR = (color >> 16) & 0xff;
int destG = (color >> 8) & 0xff;
int destB = color & 0xff;

// Give the same weight to source R,G,B, thus grasping the intensity
// -> the shading overlay
float mean = 0.33f;
ColorMatrixColorFilter cm = new ColorMatrixColorFilter(
        new float[]{
                mean,mean,mean,0,destR,
                mean,mean,mean,0,destG,
                mean,mean,mean,0,destB,
                0,0,0,1,destA }
);

Paint p = new Paint();
p.setColorFilter(cm);
...

必然的に、これは宛先の色をわずかに変更 (明るく) するので、より良い解決策が得られるまで数日待ちます。私の入力画像では、mean値を約に下げることでより良い結果が得られます。0.2。

で同じ結果が得られる可能性がありLightningColorFilterます。

于 2015-12-30T14:40:25.227 に答える