Как изменить цвет изображения растрового изображения в Android?
Я разрабатываю приложение для Android, в котором я устанавливаю изображение в изображение. Теперь я хочу изменить цвет растрового изображения. Предположим, что у моего изображения сначала красный цвет, и теперь мне нужно изменить его на оранжевый цвет. Как я могу это сделать? Пожалуйста, помогите.
Вот мой код. Мне удалось изменить непрозрачность, но я не знаю, как изменить цвет.
@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;
}
Ответы
Ответ 1
Я получил свое решение.
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);
Ответ 2
Я попробовал ответ 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, пока вы не получить то, что вам нужно:
imgView.setColorFilter(ContextCompat.getColor(this, R.color.COLOR_1_DARK), PorterDuff.Mode.SRC_ATOP);
Обновление 2
Еще один хороший вариант использования, который у меня был для этого в последнее время, - это настройка внешнего вида значка маркера Google map v2. Чтобы использовать 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();
}
}
Ответ 3
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);
}
Ответ 4
Самый простой способ изменить цвет растровых изображений - с помощью этого метода:
bitmap.eraseColor(ContextCompat.getColor(this, R.color.your_color));
Если вы хотите наложить ImageView с использованием цвета:
imageView.setColorFilter(ContextCompat.getColor(this, R.color.your_color));
Ответ 5
Лучше получить изменчивое растровое изображение путем копирования, без изменения размера:
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;
}
Ответ 6
Немного не по теме, но учитывая, что вы хотите отображать только измененный цвет, это мое решение. А именно, самый простой и быстрый способ - применить фильтр с помощью метода drawColor() на Canvas, справа после drawBitmap():
m_canvas.drawColor(Color.RED, PorterDuff.Mode.ADD);
Источники: https://developer.android.com/reference/android/graphics/PorterDuff.Mode.html