在android中将位图转换为棕褐色

有没有办法将位图转换为棕褐色? 我知道转换为grayScale是在ColorMatrix中设置setSaturation。 但是,棕褐色呢?

Solutions Collecting From Web of "在android中将位图转换为棕褐色"

如果你有图像的实例,那么你可以使用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二进制testing没有编译。

在这里输入图像说明

我知道答案,但也许如果有其他更好的解决scheme..

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