我在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);
}
}
}
还有其他方法吗?因为下面的方法工作时间太长。
当然,您可以加快执行速度,因为现在对于图像中的每个像素,您都将实例化一个新的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);
}
}
}
(顺便说一句,您是要检查红色还是蓝色和绿色?看起来像是奇怪的标准,除非您只想在原始颜色是纯黄色,青色或白色的情况下更改颜色。)
如果仅将图像绘制为“纹理”,则无需像这样在Pixmap上进行操作。例如,使用SpriteBatch绘制图像时,可以将源图像变白并给图像着色,这不会对性能产生影响。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句