§ Матрица дизеринга
Матрица 8x8int 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) ......