§ Матрица дизеринга

Матрица 8x8
int lookup[8][8] =
{
    { 0, 32,  8, 40,  2, 34, 10, 42},
    {48, 16, 56, 24, 50, 18, 58, 26},
    {12, 44,  4, 36, 14, 46,  6, 38},
    {60, 28, 52, 20, 62, 30, 54, 22},
    { 3, 35, 11, 43,  1, 33,  9, 41},
    {51, 19, 59, 27, 49, 17, 57, 25},
    {15, 47,  7, 39, 13, 45,  5, 37},
    {63, 31, 55, 23, 61, 29, 53, 21},
}

§ Вычисление

Каждый цветовой компонент рассчитывается путем вычисления формулы:
new_clrgb = old_clrgb + k*(lookup[y & 7][x & 7] - m);
  • m = 32 (зависит от разрядности, здесь 8*8/2=32)
  • k = коэффициент размаха, например k=4 будет выдавать -128..127
  • old_cl = старый цвет от 0 до 255 (к примеру)
  • new_cl = полученный цвет
После того, как получили новый цвет, надо найти ближайший к нему цвет из индексной палитры.
Можно сделать проще, если это черно-белая картинка:
  • index_cl = 0, если new_cl < 128
  • indec_cl = 1, если new_cl >= 128

§ Пример программы

SCREEN 12

DATA 0, 32, 8,40, 2,34,10,42
DATA 48,16,56,24,50,18,58,26
DATA 12,44, 4,36,14,46, 6,38
DATA 60,28,52,20,62,30,54,22
DATA 3, 35,11,43, 1,33, 9,41
DATA 51,19,59,27,49,17,57,25
DATA 15,47, 7,39,13,45, 5,37
DATA 63,31,55,23,61,29,53,21

DIM SHARED pat(0 TO 7, 0 TO 7)

FOR i = 0 TO 7: FOR j = 0 TO 7: READ pat(j, i): NEXT: NEXT

k = 4
FOR y = 0 TO 480
FOR x = 0 TO 640

  m  = (x + y) MOD 256
  cl = (pat(x MOD 8, y MOD 8) - 32) * k + m

  IF cl > 128 THEN cl = 15 ELSE cl = 0
  PSET (x, y), cl

NEXT
NEXT

§ Цветной вариант

...

  ' ---
  r = y \ 2 MOD 256
  g = y \ 2 MOD 256
  b = 255
  ' ---

  clr = (pat(x MOD 8, y MOD 8) - 32) * k + r
  clg = (pat(x MOD 8, y MOD 8) - 32) * k + g
  clb = (pat(x MOD 8, y MOD 8) - 32) * k + b

  IF clr > 128 THEN r = 1 ELSE r = 0
  IF clg > 128 THEN g = 1 ELSE g = 0
  IF clb > 128 THEN b = 1 ELSE b = 0

  PSET (x, y), 8 + (b + g * 2 + r * 4)

...