按颜色填充图像的不透明部分

时间:2016-06-02 11:16:42

标签: java android libgdx

我在Libgdx中有一个任务:   更改图像的颜色,例如三角形,星形,心形和其他形状。 所有形状都以透明背景的png给出。

我正在使用Pixmap进行此操作,检查每个像素是否为非透明填充像素并使用所需颜色。 这是代码:

      for (int y = 0; y < pixmap.getHeight(); y++) {
            for (int x = 0; x < pixmap.getWidth(); x++) {
                Color color = new Color();

                Color.rgba8888ToColor(color, pixmap.getPixel(x, y));

                if(color.r != 1 || color.b != 1 && color.g != 1){
                    pixmap.setColor(setColor);
                    pixmap.fillRectangle(x, y, 1, 1);
                }
            }
        }

还有其他办法吗? 因为下面的方法工作时间太长。

3 个答案:

答案 0 :(得分:1)

你当然可以加快你的工作方式,因为现在你正在为图像中的每个像素实例化一个新的Color对象并将像素组件转换成单独的浮点数。然后GC必须花时间清理你正在生成的所有Color对象。那些额外的中间步骤是不必要的。

此外,您只需要拨打pixmap.setColor一次(虽然这非常简单)。您可以使用drawPixel代替fillRectangle来更有效地绘制单个像素。

static final int R = 0xFF000000;
static final int G = 0x00FF0000;
static final int B = 0x0000FF00;

  pixmap.setColor(setColor);
  for (int y = 0; y < pixmap.getHeight(); y++) {
        for (int x = 0; x < pixmap.getWidth(); x++) {
            int pixel = pixmap.getPixel(x, y);

            if((pixel & R) != R || (pixel & B) != B && (pixel & G) != G){
                pixmap.drawPixel(x, y);
            }
        }
    }

(顺便说一下,你的意思是检查红色蓝色绿色?看起来像奇怪的标准,除非你只是想改变颜色,如果原始颜色是纯黄色,青色或白色。)

如果您只是将图像绘制为纹理,则无需像这样在Pixmaps上操作。例如,在使用SpriteBatch绘制图像时,可以使源图像变白并使图像着色,这对性能没有影响。

答案 1 :(得分:0)

支持库提供了实用程序来设置drawable。

// create a drawable from the bitmap
BitmapDrawable tintedDrawable = DrawableCompat.wrap(new BitmapDrawable(getResources(), pixmap));

// Apply a Tint, it will color all non-transparent pixel
DrawableCompat.setTint(setColor);

// Draw it back on a bitmap
Bitmap b = Bitmap.createBitmap(pixmap.getWidth(), pixmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
tintedDrawable.setBounds(0, 0, pixmap.getWidth(), pixmap.getHeight());
tintedDrawable.draw(c);

答案 2 :(得分:0)

如果您只需要在应用程序中显示具有特定颜色的这些图片,您只需使用setColorFilter

即可。
netstat -ano|find "3306"