我在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);
}
}
}
还有其他办法吗? 因为下面的方法工作时间太长。
答案 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"