改变位图的颜色

时间:2015-01-19 12:52:54

标签: java android bitmap

我试图创建一个获取位图和命运颜色的函数并返回彩色位图(不使用绘图)。我找到了几种方法,但没有任何方法可以像我想要的那样。

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

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

但它在透明图像上效果不佳,如此处(前后)所见: enter image description here

任何人都有其他解决方案(根本不使用油漆)?

3 个答案:

答案 0 :(得分:5)

您只需要提取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;
}

答案 1 :(得分:1)

这是一个用于更改位图颜色的示例代码:

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

答案 2 :(得分:0)

你这样做:

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

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