Конвертировать растровые изображения в сепию в Android - PullRequest
11 голосов
/ 10 ноября 2010

Есть ли способ конвертировать растровое изображение в сепию? Я знаю, чтобы преобразовать в grayScale, чтобы установить setSaturation в ColorMatrix. Но как насчет сепии?

Ответы [ 3 ]

20 голосов
/ 05 февраля 2012

Если у вас есть экземпляр изображения, вы можете использовать ColorMartix, чтобы нарисовать его в сепии. Позвольте мне описать, как вы можете сделать это, используя Drawable.

public static void setSepiaColorFilter(Drawable drawable) {
  if (drawable == null)
    return;

  final ColorMatrix matrixA = new ColorMatrix();
  // making image B&W
  matrixA.setSaturation(0);

  final ColorMatrix matrixB = new ColorMatrix();
  // applying scales for RGB color values
  matrixB.setScale(1f, .95f, .82f, 1.0f);
  matrixA.setConcat(matrixB, matrixA);

  final ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrixA);
  drawable.setColorFilter(filter);
}

Пример проекта был перемещен из Bitbucket в GitHub . Пожалуйста, проверьте Раздел релиза , чтобы загрузить APK двоичный файл для тестирования без компиляции.

enter image description here

5 голосов
/ 10 ноября 2010

Я знаю ответ, но, возможно, если у кого-то есть другое лучшее решение ..

public Bitmap toSephia(Bitmap bmpOriginal)
{        
    int width, height, r,g, b, c, gry;
    height = bmpOriginal.getHeight();
    width = bmpOriginal.getWidth();
    int depth = 20;

    Bitmap bmpSephia = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bmpSephia);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();
    cm.setScale(.3f, .3f, .3f, 1.0f);   
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
    paint.setColorFilter(f);
    canvas.drawBitmap(bmpOriginal, 0, 0, paint);
    for(int x=0; x < width; x++) {
        for(int y=0; y < height; y++) {
            c = bmpOriginal.getPixel(x, y);

            r = Color.red(c);
            g = Color.green(c);
            b = Color.blue(c);

            gry = (r + g + b) / 3;
            r = g = b = gry;

            r = r + (depth * 2);
            g = g + depth;

            if(r > 255) {
              r = 255;
            }
            if(g > 255) {
              g = 255;
            }
            bmpSephia.setPixel(x, y, Color.rgb(r, g, b));
        }
    }      
    return bmpSephia;
}
0 голосов
/ 22 февраля 2016

Я улучшил ответ ОП . По сравнению с метод ColorMatrix он работает очень быстро, но при этом получается более приятный коричневый оттенок. (по моему мнению)

public Bitmap toSepiaNice(Bitmap color) {
    int red, green, blue, pixel, gry;
    int height = color.getHeight();
    int width = color.getWidth();
    int depth = 20;

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

    int[] pixels = new int[width * height];
    color.getPixels(pixels, 0, width, 0, 0, width, height);
    for (int i = 0; i < pixels.length; i++) {
        pixel = pixels[i];

        red = (pixel >> 16) & 0xFF;
        green = (pixel >> 8) & 0xFF;
        blue = pixel & 0xFF;

        red = green = blue = (red + green + blue) / 3;

        red += (depth * 2);
        green += depth;

        if (red > 255)
            red = 255;
        if (green > 255)
            green = 255;
        pixels[i] = (0xFF << 24) | (red << 16) | (green << 8) | blue;
    }
    sepia.setPixels(pixels, 0, width, 0, 0, width, height);
    return sepia;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...