如何更改Android中的位图图像颜色?

我正在开发一个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; } 

Solutions Collecting From Web of "如何更改Android中的位图图像颜色?"

我试过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 drawable的主要颜色,你可以使用:

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

如果您需要更多的灵活性,或者这不能达到预期的效果,那么有一个超载可以让您更改PorterDuff模式,直到您获得所需内容:

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

更新2

另一个很好的用例是我自己定制了一个Google map v2标记图标的外观。 为了使用2个graphics来允许(例如)标记上的小/大图标,而是通过dynamic地改变它们的颜色来在这两个graphics上显示一系列颜色。 在我的情况下,我在一个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(); } } 

我得到了一个解决scheme。

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

使用此方法更改位图颜色的最简单方法是:

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

如果您想要使用颜色覆盖ImageView:

 imageView.setColorFilter(ContextCompat.getColor(this, R.color.your_color)); 

最好通过复制获取可变位图,而不改变大小:

 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; } 

一个小题目,但考虑到你只想显示在改变颜色这里是我的解决scheme。 也就是说,最简单快捷的方法就是在canvas上使用drawColor()方法, 在drawBitmap()之后 使用filter:

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

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