Алгоритм для идеального преобразования 24-битного RGB в 8-битный 256 цветов
Да, я сделал поиск в 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 - внизу)
Они в основном идеальны, за исключением серых точек, показанных на рисунке выше. Есть ли алгоритм, который может это исправить?