Comment changer la couleur de L'image Bitmap dans android?

Je développe une application android dans laquelle je mets une image à imageview. Maintenant programmatique je veux changer l'image bitmap couleur. Supposons que mon image ait une couleur rouge au départ et maintenant je dois la changer en couleur orange. Comment puis-je le faire? S'il vous plaît aider.

Voici mon code. J'ai réussi à changer l'opacité, mais je ne sais pas comment changer la couleur.

  @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;
    } 
35
demandé sur Gopal Singh Sirvi 2011-04-18 11:31:33

7 réponses

J'ai essayé la réponse de Josip mais ne fonctionnerait pas pour moi, que le paramètre offset soit 1 ou 0 - le bitmap dessiné est apparu dans la couleur d'origine.

Cependant, cela a fonctionné:

// 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);

Mise à Jour 1

, Tandis que le ci-dessus fonctionne bien et est utile dans beaucoup de cas, si vous voulez juste changer la couleur d'un ImageView drawable, qui l'op n', vous pouvez simplement utiliser:

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

Si vous avez besoin de plus de flexibilité ou cela ne donne pas le effet désiré, il y a une surcharge qui vous permet de changer le mode PorterDuff jusqu'à ce que vous obteniez ce que vous recherchez:

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

Mise à Jour 2

Un autre bon cas d'utilisation que j'ai eu pour cela dernièrement est la personnalisation de l'apparence d'une icône de marqueur Google map v2. Afin d'utiliser 2 graphiques pour permettre (par exemple) petites / grandes icônes sur un marqueur, mais aussi une gamme de couleurs sur ces 2 graphiques en changeant la couleur d'entre eux dynamiquement. Dans mon cas, je faisais cela à l'intérieur d'un ClusterRenderer comme les marqueurs ont également été clustered, mais cela peut être utilisé avec un marqueur de carte régulière de la même manière:

@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();
    }
}
48
répondu Breeno 2017-06-07 00:21:40

J'ai une sorte de solution.

    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);
37
répondu 2011-05-09 10:38:23
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);
}
30
répondu Josip 2013-09-09 10:52:07

Il vaut mieux obtenir un bitmap mutable par copie, sans changer de taille:

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;
}
7
répondu Aliaksei Rak 2017-05-25 15:19:37

La façon la plus simple de changer la couleur des bitmaps est avec cette méthode:

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

Si vous voulez superposer L'ImageView avec la couleur, Utilisez:

imageView.setColorFilter(ContextCompat.getColor(this, R.color.your_color));
4
répondu box 2016-10-13 11:19:02

Un peu hors sujet, mais considérant que vous voulez seulement afficher en couleur changée voici ma solution. A savoir, le moyen le plus simple et rapide consiste simplement à appliquer un filtre par en utilisant la méthode drawColor() sur Canvas, à droite après drawBitmap():

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

Sources: https://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

1
répondu TomeeNS 2016-07-17 13:56:32

J'ai résolu le problème en utilisant ce,

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
répondu Akansha patel 2018-08-09 11:11:11