我使用各种颜色实用程序来混合颜色,但由于订单无组织,它会产生不正确的值。我环顾四周,发现只有单色或两种颜色混合。
所以相反,我把颜色放到一个数组中,我正在试图找出如何混合它们,但现在我被卡住了。
我的尝试:
Array<Color> colorsArray;
for(Color eachColor : colors)
colorsArray.add(new Color(
eachColor.r, eachColor.g, eachColor.b,
strength //<<Varies.
);
));
/We have an array of play colors and there strengths, process them into an average.
float totalRed = 0f, totalBlue = 0f, totalGreen = 0f;
for(ColorStorage colorStorage : colorVectorsWithInfectionStrength)
{
totalRed += (colorStorage.getRed() * colorStorage.getAlpha());
totalBlue += (colorStorage.getBlue() * colorStorage.getAlpha());
totalGreen += (colorStorage.getGreen() * colorStorage.getAlpha());
}
/* Makes dark colors. HMM.
totalRed /= colorVectorsWithInfectionStrength.size;
totalBlue /= colorVectorsWithInfectionStrength.size;
totalGreen /= colorVectorsWithInfectionStrength.size;
*/
ColorStorage averageColor = new ColorStorage(totalRed, totalBlue, totalGreen);
//varying var goes from 0-1 depending on the max strength.
endColor = ColorUtils.blend(averageColor, endColor, varyingVar);
混合功能:
public static ColorStorage blend(ColorStorage color1, ColorStorage color2, double ratio)
{
float r = (float) ratio;
float ir = (float) 1.0 - r;
float rgb1[] = color1.getColorComponents();
float rgb2[] = color2.getColorComponents();
return new ColorStorage (
rgb1[0] * r + rgb2[0] * ir,
rgb1[1] * r + rgb2[1] * ir,
rgb1[2] * r + rgb2[2] * ir
);
}
修改的 这里的颜色对象是自定义的,总是为RGBA返回0-1f。 (每个值)
答案 0 :(得分:3)
你试过除以数组大小,它产生的颜色太暗了。这是因为你将每个组件乘以alpha值(而不是1,就像没有alpha通道一样)。如果要正确标准化颜色,则需要除以alpha的总和。
float totalAlpha = 0;
for(ColorStorage colorStorage : colorVectorsWithInfectionStrength)
{
totalRed += (colorStorage.getRed() * colorStorage.getAlpha());
totalBlue += (colorStorage.getBlue() * colorStorage.getAlpha());
totalGreen += (colorStorage.getGreen() * colorStorage.getAlpha());
totalAlpha += colorStorage.getAlpha();
}
totalRed /= totalAlpha;
totalBlue /= totalAlpha;
totalGreen /= totalAlpha;
这应该给你正确的比例。
请注意,由于RGB色彩空间不是线性的,因此无法为您提供准确的混合。但它足够接近偶然使用。