Вам нужно использовать дизеринг. Floyd-Steinberg - это хороший алгоритм, который прост и работает быстро.
Вам не нужно переходить к 8 битам на пиксель, как предполагает другой ответ, вы можете перейти непосредственно к 16 битам на пиксель. Вы должны знать, как он разбивается на R / G / B, прежде чем начать.
Вот несколько примеров, в первую очередь это оригинальный 24-бит:
Далее идет 16-разрядное без сглаживания:
Наконец, 16-битный с дизерингом Флойда-Стейнберга.
P.S. Я сделал это с Paint Shop Pro, я не знаю, есть ли в Photoshop что-нибудь подобное. Вы можете сделать это и в коде.