Преобразование растрового изображения в сепию в android

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

Если у вас есть экземпляр изображения, вы можете использовать ColorMartix для рисования в Sepia. Позвольте мне описать, как вы можете это сделать, используя 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 . Пожалуйста, проверьте раздел Release для загрузки APK-двоичного кода для тестирования без компиляции.

Введите описание изображения здесь

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

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

Я улучшил ответ OP . Это работает быстро и быстро по сравнению с методом 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; }