Я намерен отображать (4, 8 или 16 бит на канал - без альфа) изображения на 1-битном дисплее во встроенной системе.Изображения хранятся в кортежах RGB.Я намерен использовать Floyd-Steinburg, поскольку он выглядит достаточно хорошо, более чем достаточно быстр и лаконичен в коде.
В отношении статьи WikiPedia у меня есть два вопроса.
Какова будет наилучшая практика для выражения ближайшего цвета? Будет ли работать следующее?(игнорируйте, что я возвращаю структуру в c)
typedef rgb16_tag { unsigned short r, g, b } rgb16;
rgb16 nearest_1bit_colour(rgb16 p) {
double c; rgb16 r;
c = ((double)(p.r + p.g + p.b + 3 * (1 << 15))) / ( 3.0 * (1 << 16));
if (c>= 1.0) {
r.r = r.g = r.b = 1;
} else {
r.r = r.g = r.b = 0;
}
return r;
}
и, Выражение ошибки квантования выполняется для каждого канала? то есть имеет ли это смысл?
rgb16 q, new, old, image[X][Y];
int x, y;
... /* (somewhere in the nested loops) */
old = image[x][y];
new = nearest_1bit_colour(old);
/* Repeat the following for each colour channel seperately. */
q.{r,g,b} = old.{r,g,b} - new.{r,g,b};
image[x+1][y].{r,g,b} = image[x+1][y].{r,g,b} + 7/16 * q.{r,g,b}
image[x-1][y+1].{r,g,b} = image[x-1][y+1].{r,g,b} + 3/16 * q.{r,g,b}
image[x][y+1].{r,g,b} = image[x][y+1].{r,g,b} + 5/16 * q.{r,g,b}
image[x+1][y+1].{r,g,b} = image[x+1][y+1].{r,g,b} + 1/16 * q.{r,g,b}