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

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

§ Вычисление

Каждый цветовой компонент рассчитывается путем вычисления формулы:
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

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

1SCREEN 12
2
3DATA 0, 32, 8,40, 2,34,10,42
4DATA 48,16,56,24,50,18,58,26
5DATA 12,44, 4,36,14,46, 6,38
6DATA 60,28,52,20,62,30,54,22
7DATA 3, 35,11,43, 1,33, 9,41
8DATA 51,19,59,27,49,17,57,25
9DATA 15,47, 7,39,13,45, 5,37
10DATA 63,31,55,23,61,29,53,21
11
12DIM SHARED pat(0 TO 7, 0 TO 7)
13
14FOR i = 0 TO 7: FOR j = 0 TO 7: READ pat(j, i): NEXT: NEXT
15
16k = 4
17FOR y = 0 TO 480
18FOR x = 0 TO 640
19
20  m  = (x + y) MOD 256
21  cl = (pat(x MOD 8, y MOD 8) - 32) * k + m
22
23  IF cl > 128 THEN cl = 15 ELSE cl = 0
24  PSET (x, y), cl
25
26NEXT
27NEXT

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

1...
2
3  ' ---
4  r = y \ 2 MOD 256
5  g = y \ 2 MOD 256
6  b = 255
7  ' ---
8
9  clr = (pat(x MOD 8, y MOD 8) - 32) * k + r
10  clg = (pat(x MOD 8, y MOD 8) - 32) * k + g
11  clb = (pat(x MOD 8, y MOD 8) - 32) * k + b
12
13  IF clr > 128 THEN r = 1 ELSE r = 0
14  IF clg > 128 THEN g = 1 ELSE g = 0
15  IF clb > 128 THEN b = 1 ELSE b = 0
16
17  PSET (x, y), 8 + (b + g * 2 + r * 4)
18
19...