【问题标题】:change color of bitmap改变位图的颜色
【发布时间】:2015-01-19 12:52:54
【问题描述】:

我正在尝试创建一个获取位图和命运颜色并返回彩色位图的函数(不使用绘画)。我发现了几种方法,但没有什么能像我想要的那样工作。

我能找到的最接近的解决方案是:

    public static Bitmap changeImageColor(Bitmap srcBmp, int dstColor) {

        int width = srcBmp.getWidth();
        int height = srcBmp.getHeight();

        float srcHSV[] = new float[3];
        float dstHSV[] = new float[3];

        Bitmap dstBitmap = Bitmap.createBitmap(width, height, Config.RGB_565);

        for (int row = 0; row < height; row++) {
            for (int col = 0; col < width; col++) {
                Color.colorToHSV(srcBmp.getPixel(col, row), srcHSV);
                Color.colorToHSV(dstColor, dstHSV);

                // If it area to be painted set only value of original image
                dstHSV[2] = srcHSV[2];  // value
                int color2=Color.HSVToColor(dstHSV);;
                dstBitmap.setPixel(col, row, Color.HSVToColor(dstHSV));
            }
        }

        return dstBitmap;
    }

但它在透明图像上效果不佳,如下所示(之前和之后):

任何人有任何其他解决方案(同样不使用油漆)?

【问题讨论】:

  • 我在这里回答了一个类似的问题:stackoverflow.com/questions/24040036/… 它使用yourImageView.setColorFilter(yourColor, PorterDuff.Mode.MULTIPLY);
  • 我只使用位图,我需要一个返回彩色位图的函数..

标签: java android bitmap


【解决方案1】:

您只需要提取 alpha 并在转换后重新应用它。并使用ARGB_8888;

编辑您的代码以包含 alpha:

public Bitmap colorize(Bitmap srcBmp, int dstColor) {

        int width = srcBmp.getWidth();
        int height = srcBmp.getHeight();

        float srcHSV[] = new float[3];
        float dstHSV[] = new float[3];

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

        for (int row = 0; row < height; row++) {
            for (int col = 0; col < width; col++) {
                int pixel = srcBmp.getPixel(col, row);
                int alpha = Color.alpha(pixel);
                Color.colorToHSV(pixel, srcHSV);
                Color.colorToHSV(dstColor, dstHSV);

                // If it area to be painted set only value of original image
                dstHSV[2] = srcHSV[2];  // value
                dstBitmap.setPixel(col, row, Color.HSVToColor(alpha, dstHSV));
            }
        }

        return dstBitmap;
}

【讨论】:

  • 我不知道什么是光栅,并且在 android 只有 HSV 中没有 HSL
  • Raster 是一个类似于 Bitmap 的 java 对象。基本上是像素图。上面的代码稍作修改就可以应用于位图而不是光栅。是的,android 只有 HSV,这就是为什么上面包含 RGBtoHSL 和 HSLtoRGB 的自定义方法
  • 但为什么会有两个栅格?颜色在哪里,什么是 writeableraster?
  • 我将修复您的代码以在不透明度不变的情况下进行着色。
  • 我在答案中编辑了您的代码以包含 alpha 内容。快速测试显示它的工作原理。如果它也适合您,请检查为已接受的答案。
【解决方案2】:

这里是更改位图颜色的示例代码:

private BitmapDrawable getColoredBitmap(int color, Context context,
            int drawableId) {
        Bitmap source = BitmapFactory.decodeResource(context.getResources(),
                drawableId);
        final Bitmap bitmap = Bitmap.createBitmap(source.getWidth(),
                source.getHeight(), Bitmap.Config.ARGB_8888);
        for (int i = 0; i < source.getWidth(); i++) {
            for (int j = 0; j < source.getHeight(); j++) {
                int pixel = source.getPixel(i, j);

                // if (pixel == Color.TRANSPARENT) {
                //
                // } else
                if (pixel == Color.WHITE) {
                    pixel = Color.argb(Color.alpha(pixel),
                            Color.red(Color.WHITE), Color.green(Color.WHITE),
                            Color.blue(Color.WHITE));
                } else {
                    pixel = Color.argb(Color.alpha(pixel), Color.red(color),
                            Color.green(color), Color.blue(color));
                }
                bitmap.setPixel(i, j, pixel);
            }
        }
        return new BitmapDrawable(context.getResources(), bitmap);
    }

【讨论】:

  • 结果是:puu.sh/eJqS9/7275c317e2.png,我不是想把它 100% 改成一种颜色,只是给它上色..
  • 它将透明颜色更改为给定颜色。
  • 你到底需要什么给源图片
  • 我希望它是彩色的,有一点颜色,但仍然能够看到块。这是源图片:puu.sh/eJrBr/0b807796a3.png
  • 这里你想换什么颜色?
【解决方案3】:

你这样做:

int alpha=srcBmp.getPixel(col, row);
dstBitmap.setPixel(col, row, Color.HSVToColor(dstHSV));

您在其中计算 alpha(从该代码的外观可能不正确)然后不使用它。您可能必须使用 HSVToColor 创建一个颜色,然后设置该颜色的 alpha,然后在 setPixel 中使用它。而且您可能必须以类似的方式获取 alpha,因为我发现很难相信 getPixel 函数只返回 alpha:p

【讨论】:

  • 我忘了删除 alpha,它实际上是不正确的。我尝试了你所说的,它并没有改变结果..
  • 那么作为一般的调试理念,您是否能够完全忽略源位图而只将目标像素设置为全部透明?因为如果你不能,你至少可以在这里问一个简单得多的问题,简单的问题得到更好的答案:)
  • 我想我可以,我会尝试,虽然我更喜欢有人能想出更好的着色解决方案,这个不是最好的,颜色太高太浓了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
相关资源
最近更新 更多