web-dev-qa-db-ja.com

アンドロイドでビットマップ画像の色を変更するには?

Androidアプリケーションで画像をimageviewに設定します。今度はプログラムでビットマップ画像の色を変更します。最初に画像の色が赤であった場合、次にそれを変更する必要がありますオレンジ色です。どうすればいいですか?助けてください。

これが私のコードです。不透明度を変更することはできましたが、色を変更する方法がわかりません。

  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView iv = (ImageView) findViewById(R.id.img);
        Drawable d = getResources().getDrawable(R.drawable.pic1);
        Bitmap mNewBitmap = ((BitmapDrawable)d).getBitmap();
        Bitmap nNewBitmap = adjustOpacity(mNewBitmap);
        iv.setImageBitmap(nNewBitmap);
    }

    private Bitmap adjustOpacity( Bitmap bitmap ) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Bitmap dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        int[] pixels = new int[width * height];
        bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
        dest.setPixels(pixels, 0, width, 0, 0, width, height);
        return dest;
    } 
42
user456118

私は一種の解決策を得た。

    Bitmap sourceBitmap = BitmapFactory.decodeFile(imgPath);
    float[] colorTransform = {
            0, 1f, 0, 0, 0, 
            0, 0, 0f, 0, 0,
            0, 0, 0, 0f, 0, 
            0, 0, 0, 1f, 0};

    ColorMatrix colorMatrix = new ColorMatrix();
    colorMatrix.setSaturation(0f); //Remove Colour 
    colorMatrix.set(colorTransform); //Apply the Red

    ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);
    Paint paint = new Paint();
    Paint.setColorFilter(colorFilter);   

    Display display = getWindowManager().getDefaultDisplay(); 

    Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap, 0, (int)(display.getHeight() * 0.15), display.getWidth(), (int)(display.getHeight() * 0.75));            

    image.setImageBitmap(resultBitmap);

    Canvas canvas = new Canvas(resultBitmap);
    canvas.drawBitmap(resultBitmap, 0, 0, Paint);
38
user744881

Josipの答えを試してみましたが、オフセットパラメータが1か0かに関係なく、うまくいきませんでした-描画されたビットマップは元の色で表示されました。

しかし、これはうまくいきました:

// You have to copy the bitmap as any bitmaps loaded as drawables are immutable
Bitmap bm = ImageLoader.getInstance().loadImageSync("drawable://" + drawableId, o)
            .copy(Bitmap.Config.ARGB_8888, true);

Paint paint = new Paint();
ColorFilter filter = new PorterDuffColorFilter(ContextCompat.getColor(this, R.color.COLOR_1_DARK), PorterDuff.Mode.SRC_IN);
Paint.setColorFilter(filter);

Canvas canvas = new Canvas(bm);
canvas.drawBitmap(bm, 0, 0, Paint);

更新1

上記がうまく機能し、多くの場合に役立ちますが、ImageViewドロウアブルのメインカラーを変更したい場合は、op 、あなただけを使用することができます:

imgView.setColorFilter(ContextCompat.getColor(this, R.color.COLOR_1_DARK));

さらに柔軟性が必要な場合、またはこれで目的の効果が得られない場合は、目的のものが得られるまで PorterDuff Mode を変更できるオーバーロードがあります。

imgView.setColorFilter(ContextCompat.getColor(this, R.color.COLOR_1_DARK), PorterDuff.Mode.SRC_ATOP);

更新2

最近私がこれについて持っていたもう一つの良いユースケースは、Googleマップv2マーカーアイコンの外観をカスタマイズすることです。 2つのグラフィックを使用して(たとえば)マーカーの小さい/大きいアイコンだけでなく、それらの2つのグラフィックの色を動的に変更することでそれらのグラフィックの範囲を許可するため。私の場合、マーカーもクラスター化されているため、 ClusterRenderer 内でこれを行っていましたが、通常のマップマーカーでも同じように使用できます。

@Override
protected void onBeforeClusterItemRendered(MyClusterItem item, MarkerOptions markerOptions) {
    try {
        int markerColor = item.getColor();

        Bitmap icon;

        if (item.isFeatured()) {
            // We must copy the bitmap or we get an exception "Immutable bitmap passed to Canvas constructor"
            icon = BitmapFactory.decodeResource(context.getResources(),
                    R.drawable.icon_marker_large).copy(Bitmap.Config.ARGB_8888, true);
        } else {
            // We must copy the bitmap or we get an exception "Immutable bitmap passed to Canvas constructor"
            icon = BitmapFactory.decodeResource(context.getResources(),
                    R.drawable.icon_marker_small).copy(Bitmap.Config.ARGB_8888, true);
        }

        Paint paint = new Paint();
        ColorFilter filter = new PorterDuffColorFilter(ContextCompat.getColor(context, markerColor), PorterDuff.Mode.SRC_IN);
        Paint.setColorFilter(filter);

        Canvas canvas = new Canvas(icon);
        canvas.drawBitmap(icon, 0, 0, Paint);

        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
52
Breeno
private void changeColor(){
    ImageView image = (ImageView) findViewById(R.id.imageView1);
    Bitmap sourceBitmap = BitmapFactory.decodeResource(getResources(),
            R.drawable.ic_launcher);
    changeBitmapColor(sourceBitmap, image, Color.BLUE);

}

private void changeBitmapColor(Bitmap sourceBitmap, ImageView image, int color) {

    Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0,
            sourceBitmap.getWidth() - 1, sourceBitmap.getHeight() - 1);
    Paint p = new Paint();
    ColorFilter filter = new LightingColorFilter(color, 1);
    p.setColorFilter(filter);
    image.setImageBitmap(resultBitmap);

    Canvas canvas = new Canvas(resultBitmap);
    canvas.drawBitmap(resultBitmap, 0, 0, p);
}
32
Josip

サイズを変更せずに、コピーによって可変ビットマップを取得する方が適切です。

public static Bitmap changeBitmapColor(Bitmap sourceBitmap, int color)
{
    Bitmap resultBitmap = sourceBitmap.copy(sourceBitmap.getConfig(),true);
    Paint paint = new Paint();
    ColorFilter filter = new LightingColorFilter(color, 1);
    Paint.setColorFilter(filter);
    Canvas canvas = new Canvas(resultBitmap);
    canvas.drawBitmap(resultBitmap, 0, 0, Paint);
    return resultBitmap;
}
9
Aliaksei Rak

ビットマップの色を変更する最も簡単な方法は、このメソッドを使用することです:

bitmap.eraseColor(ContextCompat.getColor(this, R.color.your_color));

ImageViewを色付きでオーバーレイする場合:

imageView.setColorFilter(ContextCompat.getColor(this, R.color.your_color));
4
box
public Bitmap replaceColor(Bitmap src,int fromColor, int targetColor) {
    if(src == null) {
        return null;
    }
    // Source image size
    int width = src.getWidth();
    int height = src.getHeight();
    int[] pixels = new int[width * height];
    //get pixels
    src.getPixels(pixels, 0, width, 0, 0, width, height);

    for(int x = 0; x < pixels.length; ++x) {
        pixels[x] = (pixels[x] == fromColor) ? targetColor : pixels[x];
    }
    // create result bitmap output
    Bitmap result = Bitmap.createBitmap(width, height, src.getConfig());
    //set pixels
    result.setPixels(pixels, 0, width, 0, 0, width, height);

    return result;
}
3
DEVSHK

ちょっとしたトピックですが、ここで色を変えて表示したいだけなら、私の解決策です。つまり、最も簡単で迅速な方法は、キャンバス上でdrawColor()メソッドを使用して、右にdrawBitmap()の後にフィルターを適用するだけです。

 m_canvas.drawColor(Color.RED, PorterDuff.Mode.ADD);

ソース: https://developer.Android.com/reference/Android/graphics/PorterDuff.Mode.html

1
TomeeNS

以下のコードを使用して問題を解決しました

public void changeColor(Bitmap srcImage) {

    Bitmap bmpRedscale = Bitmap.createBitmap(srcImage.getWidth(), 
    srcImage.getHeight(), Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(bmpRedscale);
    Paint paint = new Paint();

    ColorMatrix cm = new ColorMatrix();
    cm.setRGB2YUV();
    Paint.setColorFilter(new ColorMatrixColorFilter(cm));
    canvas.drawBitmap(srcImage, 0, 0, Paint);

    mImgEdited.setImageBitmap(bmpRedscale);
}
0
Akansha patel