Android:更改 png 文件颜色的最简单方法

Posted

技术标签:

【中文标题】Android:更改 png 文件颜色的最简单方法【英文标题】:Android: Easiest way to change the colour of a png file 【发布时间】:2012-12-15 03:54:15 【问题描述】:

我正在编写一个具有基本精灵(气球)的游戏 - 目前我创建了 2 个不同颜色的气球 PNG 文件,我需要创建更多(可能另外 5 个左右)并且不想要拥有 7 个不同的 png 文件。 (这将是 20 个额外的文件,因为我有 4 种不同的大小用于缩放目的)我宁愿坚持 1 - 我目前拥有的文件是黄色和红色的(几乎是实心的,但不完全是 - 它们有详细信息)。

问题 - 有没有一种简单的方法可以改变我现有 PNG 文件的颜色?我见过有人提到setColorsetColorFilter,但我不知道如何使用它们。这些甚至可以在已经有颜色的 PNG 文件上工作,还是只能在白色 PNG 文件上工作(我不认为我的 PNG 实际上只能是白色的)?

感谢大家的帮助,我们将不胜感激。

【问题讨论】:

【参考方案1】:

您可以只使用黑色气球 png 文件来创建不同颜色的气球。

下面的代码使用一些花哨的混合模式技巧来设置颜色。

protected BitmapDrawable setIconColor(int color) 
    if (color == 0) 
        color = 0xffffffff;
    

    final Resources res = getResources();
    Drawable maskDrawable = res.getDrawable(R.drawable.actionbar_icon_mask);
    if (!(maskDrawable instanceof BitmapDrawable)) 
        return;
    

    Bitmap maskBitmap = ((BitmapDrawable) maskDrawable).getBitmap();
    final int width = maskBitmap.getWidth();
    final int height = maskBitmap.getHeight();

    Bitmap outBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(outBitmap);
    canvas.drawBitmap(maskBitmap, 0, 0, null);

    Paint maskedPaint = new Paint();
    maskedPaint.setColor(color);
    maskedPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));

    canvas.drawRect(0, 0, width, height, maskedPaint);

    BitmapDrawable outDrawable = new BitmapDrawable(res, outBitmap);
    return outDrawable;

【讨论】:

漂亮!已经在这个一个多小时了。正在尝试根据用户设置为标记(Google Map v2 API)着色。你救了我!比每种颜色都有一个图像(可绘制)要好得多。【参考方案2】:

您可以尝试使用随机 r g b 值定义自定义 ColorMatrix:

Random rand = new Random();
int r = rand.nextInt(256);
int g = rand.nextInt(256);
int b = rand.nextInt(256);

ColorMatrix cm = new ColorMatrix();
cm.set(new float[] 
                   1, 0, 0, 0, r,
                   0, 1, 0, 0, g,
                   0, 0, 1, 0, b,
                   0, 0, 0, 1, 0 ); // last line is antialias
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(myBitmap, toX, toY, paint);

希望对你有帮助。

【讨论】:

你最好用灰度输入。 大家好,非常感谢,我会试试这个建议,我当然可以将我当前的图形转换为灰度 - 干杯! Nitin 和 Peekler - 抱歉,我病了,所以没能早点找到我的电脑。我已经查看了这两个建议并且我已经实现了 Peekler 的方法,因为它是两者中更简单的,并且似乎可以满足我的需要。但是非常感谢你们的帮助,非常感谢。我需要知道如何从变化中排除某种颜色 - 我的气球有黑色边框,我想保持黑色 - 有什么想法吗?还是我应该提出一个新问题?再次感谢大家!

以上是关于Android:更改 png 文件颜色的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

转换为png时如何更改图像中的单一颜色?

使用 python/pandas 在 excel 上创建颜色渐变的最简单方法?

如何在将 eps 文件转换为 jpeg 或 png 时更改其背景颜色

当背景颜色为白色时,Android 通知图标颜色不会更改

使用 CSS 更改 .png 颜色 [重复]

在 Android Studio 中签署 Android apk 文件的最简单方法是啥? [复制]