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

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

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

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

【问题讨论】:

    标签: android graphics colors png drawable


    【解决方案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 的方法,因为它是两者中更简单的,并且似乎可以满足我的需要。但是非常感谢你们的帮助,非常感谢。我需要知道如何从变化中排除某种颜色 - 我的气球有黑色边框,我想保持黑色 - 有什么想法吗?还是我应该提出一个新问题?再次感谢大家!
    猜你喜欢
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2023-04-09
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多