Настройка насыщенности и ColorFilter для изображения одновременно - PullRequest
3 голосов
/ 14 сентября 2011

Следующая функция успешно изменяет контраст и яркость изображения.

Bitmap bmp;
ImageView alteredImageView;
...
public void drawAlteredImage(float contr,float bright) {
    Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
    Canvas canvas = new Canvas(alteredBitmap);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();

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

    paint.setColorFilter(new ColorMatrixColorFilter(cm));
    Matrix matrix = new Matrix();
    canvas.drawBitmap(bmp, matrix, paint);
    alteredImageView.setImageBitmap(alteredBitmap);
}

Но когда я добавил метод setSaturation в ColorMatrix, контраст и изменение яркости перестали работать. Код:

public void drawAlteredImage(float contr,float bright,float satur) {
    Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
    Canvas canvas = new Canvas(alteredBitmap);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();

    cm.set(new float[] { 
            contr, 0, 0, 0, bright, 
            0, contr, 0, 0, bright, 
            0, 0, contr, 0, bright, 
            0, 0, 0, 1, 0 });
    cm.setSaturation(satur);
    paint.setColorFilter(new ColorMatrixColorFilter(cm));
    Matrix matrix = new Matrix();
    canvas.drawBitmap(bmp, matrix, paint);
    alteredImageView.setImageBitmap(alteredBitmap);
}

В этом случае применяется только эффект насыщения. Почему эта проблема происходит? Как я могу это исправить?

Ответы [ 2 ]

7 голосов
/ 24 сентября 2011

Метод setSaturation(...) заменяет все значения в матрице.Вы можете создать матрицу, объединяющую обе операции, или выполнить операции с двумя отдельными вызовами drawBitmap(...).

Попробуйте:

cm.setSaturation(satur);
final float m[] = cm.getArray();
final float c = contr;
cm.set(new float[] { 
        m[ 0] * c, m[ 1] * c, m[ 2] * c, m[ 3] * c, m[ 4] * c + bright, 
        m[ 5] * c, m[ 6] * c, m[ 7] * c, m[ 8] * c, m[ 9] * c + bright, 
        m[10] * c, m[11] * c, m[12] * c, m[13] * c, m[14] * c + bright, 
        m[15]    , m[16]    , m[17]    , m[18]    , m[19] }); 
0 голосов
/ 03 августа 2017

Другой вариант - создать новую ColorMatrix, установить насыщенность в этой новой ColorMatrix, а затем вызвать postConcat для ColorMatrix Brightness / Contrast.Что-то вроде:

public void drawAlteredImage(float contr,float bright,float satur) {
    Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
    Canvas canvas = new Canvas(alteredBitmap);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();

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

    ColorMatrix saturationCM = new ColorMatrix();
    saturationCM.setSaturation(satur);
    cm.postConcat(saturationCM);

    paint.setColorFilter(new ColorMatrixColorFilter(cm));
    Matrix matrix = new Matrix();
    canvas.drawBitmap(bmp, matrix, paint);
    alteredImageView.setImageBitmap(alteredBitmap);

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...