Алгоритм для идеального преобразования 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 - внизу)

Они в основном идеальны, за исключением серых точек, показанных на рисунке выше. Есть ли алгоритм, который может это исправить?

0 ответов

Другие вопросы по тегам