java - 改变位图的颜色

标签 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

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

最佳答案

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

关于java - 改变位图的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28025107/

相关文章:

c# - 将 TransformedBitmap 对象保存到磁盘。

java - var.getClass() 什么时候返回 Object?

java - 使用 Websphere 在 Java 中读取环境变量

java - 替换字符串会删除文本中的所有内容

android - 安卓上的 PyQt

iphone - 初学者的语言应用程序

Android - 从计时器线程更新位图

java - Activity 不会实例化

java - Android 驱动程序 JDBC PostgreSQL

android - 在调用 Bitmap.recycle() 之后我应该信任垃圾收集器吗?