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

Posted

技术标签:

【中文标题】在android中将位图转换为棕褐色【英文标题】:Convert bitmap to sepia in android 【发布时间】:2011-05-07 16:04:33 【问题描述】:

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

【问题讨论】:

@EpicPandaForce:您的具体要求是什么?您想要一种具有不同方法的算法吗? @aminography 我想为这里现有的答案之一提供 250 个声誉,因为它解决了我今天遇到的问题;但我还有 16 小时的时间可以颁发该奖项。 哦,干得好老兄:-) 【参考方案1】:

如果您有图像实例,那么您可以使用 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 section下载APK二进制文件进行测试,无需编译。

【讨论】:

如何获得 ColorMatric 以获得更多效果,如霓虹灯、靛蓝、浅绿色、生动等,等待相关链接/提示/指南... 你需要找到对应的颜色矩阵值来获得这些效果。抱歉,我不知道您可以在哪里找到它。如果您发现任何有用的信息,请在此处发布。谢谢 我为 ColorMatrix 找到了这个,并为我需要的颜色效果设置了类似的值。 docs.rainmeter.net/tips/colormatrix-guide 其实很简单,只要根据颜色的 RGB 值找到值,就可以得到任何你想要的颜色。一旦饱和度设置为 0,它会将像素的亮度与新颜色结合起来,然后就可以正常工作了。虽然我正在回答 6 年前被问到的问题......:D【参考方案2】:

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

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;

【讨论】:

当图像像素更多时,这将需要更多的处理时间,所以还有其他方法吗? 此方法在透明像素上失败【参考方案3】:

我对@9​​87654321@ 进行了改进。与the ColorMatrix method 相比,它的运行速度具有竞争力,但会产生更好的棕色调。 (在我看来)

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;

【讨论】:

以上是关于在android中将位图转换为棕褐色的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中将图标转换为位图? [复制]

如何在xamarin android中将位图图像转换为gif?

在 NetworkOnMainThreadException 中将 url 转换为位图 [重复]

如何在 android 中将 Bitmap 转换为 Drawable?

在android中将图像作为BLOB上传到SQL

将大量数据从 servlet 传输到 android 应用程序