Изменить цвет растрового изображения с помощью функции - PullRequest
4 голосов
/ 22 марта 2012

Мне нужна функция, которая будет принимать растровое изображение и возвращать растровое изображение с измененным цветом. Это должно быть быстро и просто.

Его цель - изменить цвет, также это png с альфа-символами.

Я посмотрел онлайн, но я не могу использовать холст или что-то внешнее. Функция находится во внешнем объекте (не спрашивайте ..)

Вот то, к чему я так далеко (не работает). Я знаю, что я действительно близок, просто нужно разобраться в цветовой матрице и заставить альфа работать.

public Bitmap changeBitmapColor(Bitmap sourceBitmap, int deg)
{   
    int width, height;
    height = sourceBitmap.getHeight();
    width = sourceBitmap.getWidth();    

    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);

    Canvas c = new Canvas(bmpGrayscale);
    Paint paint = new Paint();

    //figure out color matricies.
    ColorMatrix cm = new ColorMatrix();

    //cm.setSaturation(0);

    cm.set(new float[] 
    {
            0, 0, 0, 0, 0,
            0, 1, 0, 0, 0,
            0, 0, 255, 0, 0,
            0, 0, 0, 1, 0,
            0, 0, 0, 0, 1
         }); 


    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
    paint.setColorFilter(f);

    c.drawBitmap(sourceBitmap, 0, 0, paint);

    return bmpGrayscale;
}

Любая помощь будет отличной!

------- ИСПРАВЛЕНО --------

Я исправил это, изменив цветовую матрицу, теперь растровое изображение будет менять цвет и не отображать альфа-значения.

Во-первых, это матрица:

    cm.set(new float[] 
    {
            0, 0, 0, 0, 0,
            0, 1, 0, 0, 0,
            0, 0, 140, 0, 0,
            0, 0, 0, 1, 0,
            0, 0, 0, 0, 1
    }); 

Второе, что мне пришлось изменить, была эта строка кода:

Bitmap newBM = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

Удачи читателям!

Ответы [ 4 ]

0 голосов
/ 23 марта 2012

Вы не сказали точно, какие изменения вы пытаетесь внести в цвета. Матрица cm, которую вы определили, выглядит так, как будто у нее есть лишняя строка, и она удаляет красный, оставляет зеленый и альфа одну и умножает синий на 255. Я предполагаю, что это не то, что вы хотите.

Я иду по документации на http://developer.android.com/reference/android/graphics/ColorMatrix.html

Если вы пытаетесь повернуть оттенок, вы можете получить хорошую информацию из этого ответа: https://stackoverflow.com/a/8510751/5987

0 голосов
/ 23 марта 2012

Я не понял, какова ваша цель с изменением цвета, и что означает параметр int deg ?? Для альфы: это может помочь изменить цветовую модель вашего Bitmap bmpGrayscale с RGB_565 на ARGB_8888, так как у него есть альфа-канал. Посмотрите на Bitmap.Config

0 голосов
/ 23 марта 2012

------- ИСПРАВЛЕНО --------

Я исправил это, изменив цветовую матрицу, теперь растровое изображение будет менять цвет и не отображать альфа-значения.

Во-первых, это матрица:

cm.set(new float[] 
{
        0, 0, 0, 0, 0,
        0, 1, 0, 0, 0,
        0, 0, 140, 0, 0,
        0, 0, 0, 1, 0,
        0, 0, 0, 0, 1
}); 

Во-вторых, мне пришлось изменить эту строку кода:

Bitmap newBM = Bitmap.createBitmap (width, height, Bitmap.Config.ARGB_8888);

Удачи читателям!

0 голосов
/ 22 марта 2012

Я не понимаю, почему одиночество исключает использование холста.Вы можете создать новое растровое изображение, создать холст для рисования в нем, а затем нарисовать исходное растровое изображение, используя Paint, для которого установлен цветовой фильтр (с использованием setColorFilter).Класс PorterDuffColorFilter может помочь в этом.

...