在android中将位图转换为sepia

use*_*926 11 android android-image

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

rud*_*ude 21

如果你有图像实例,那么你可以使用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);
}
Run Code Online (Sandbox Code Playgroud)

示例项目从Bitbucket转移到GitHub.请检查发布部分下载APK二进制文件以进行测试而不进行编译.

在此输入图像描述

  • 我在ColorMatrix中找到了这个,并为我所需的颜色效果设置了simillar值.http://docs.rainmeter.net/tips/colormatrix-guide (2认同)

use*_*926 5

我知道答案,但也许有些人有其他更好的解决方案..

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;
}
Run Code Online (Sandbox Code Playgroud)