是的,我确实在Google上进行搜索,但没有找到理想的算法。
我所拥有的:(这也是janlelis/paint
中使用的算法)
/**
* Convert rgb to 8bit
*
* @param r Red
* @param g Green
* @param b Blue
* @return 8Bit color
*/
public static int rgbTo8Bit(int r, int g, int b)
{
boolean grayPossible = true;
boolean gray = false;
float sep = 42.5f;
while (grayPossible)
{
if (r < sep || g < sep || b < sep)
{
gray = r < sep && g < sep && b < sep;
grayPossible = false;
}
sep += 42.5;
}
if (gray)
{
return Math.round(232f + (r + g + b) / 33f);
}
else
{
return 16 + ((int) (6f * ((float) r / 256f))) * 36 + ((int) (6f * ((float) g / 256f))) * 6 + ((int) (6f * ((float) b / 256f)));
}
}
结果: (转换后的8位结果在顶部,原始RGB在底部)
除了上图中显示的灰点外,它们几乎都是完美的。有可以解决此问题的算法吗?