webentwicklung-frage-antwort-db.com.de

Wie kann ich die Bitmap-Bildfarbe in Android ändern?

Ich entwickle eine Android-Anwendung, in der ich ein Bild auf imageview gesetzt habe. Jetzt programmatisch möchte ich die Bitmap-Bildfarbe ändern. Angenommen, mein Bild hat anfangs eine rote Farbe, und jetzt muss ich es in orange ändern. Wie kann ich das machen? Bitte helfen.

Hier ist mein Code. Es ist mir gelungen, die Deckkraft zu ändern, aber ich weiß nicht, wie ich die Farbe ändern soll.

  @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;
    } 
38
user456118

Ich habe eine Art Lösung bekommen.

    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

Ich habe die Antwort von Josip ausprobiert, funktionierte jedoch nicht für mich, unabhängig davon, ob der Versatzparameter 1 oder 0 war - die gezeichnete Bitmap erschien gerade in der Originalfarbe.

Dies hat jedoch funktioniert:

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

Update 1

Obgleich das Obige gut funktioniert und in vielen Fällen nützlich ist, wenn Sie nur die Hauptfarbe einer ImageView - Zeichnung ändern möchten, die der Op gemacht hat, können Sie einfach Folgendes verwenden:

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

Wenn Sie mehr Flexibilität benötigen oder der gewünschte Effekt nicht erzielt wird, können Sie den PorterDuff-Modus so lange ändern, bis Sie das bekommen, wonach Sie suchen:

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

Update 2

Ein weiterer guter Anwendungsfall, den ich in letzter Zeit hatte, ist das Anpassen des Erscheinungsbilds eines Google map v2-Markierungssymbols. Um 2 Grafiken zu verwenden, um (z. B.) kleine/große Symbole auf einer Markierung zuzulassen, aber auch einen Bereich von Farben auf diesen 2 Grafiken, indem deren Farbe dynamisch geändert wird. In meinem Fall habe ich dies in einem ClusterRenderer gemacht, da die Marker ebenfalls geclustert waren, dies kann jedoch auf dieselbe Weise mit einem normalen Map-Marker verwendet werden:

@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();
    }
}
50
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);
}
31
Josip

Es ist besser, eine veränderliche Bitmap per Kopie zu erhalten, ohne die Größe zu ändern:

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;
}
8
Aliaksei Rak

Die einfachste Möglichkeit, die Farbe der Bitmaps zu ändern, ist mit dieser Methode:

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

Wenn Sie ImageView mit Farbe überlagern möchten, verwenden Sie Folgendes:

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

Ein kleines Thema, aber in Anbetracht dessen, dass Sie nur in geänderter Farbe anzeigen möchten, ist hier meine Lösung. Am einfachsten und schnellsten ist das Anwenden eines Filters mit mit der drawColor () -Methode auf Canvas, rechts nach drawBitmap ()

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

Quellen: https://developer.Android.com/reference/Android/graphics/PorterDuff.Mode.html

1
TomeeNS

Ich habe das Problem mit dem folgenden Code gelöst  

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