4x4x8 24 Опубликовано: 15 сентября, 2022 Потратив более 8 часов беспрерывного кода. Я написал дизеринг для своей либы. К сожалению этот метод ОЧЕНЬ долгий. Я напишу другой метод, в итоге будет два метода, в теории второй метод должен быть быстрее. До: После(используется несколько значений факторов) 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 15 сентября, 2022 3 минуты назад, 4x4x8 сказал: Потратив более 8 часов беспрерывного кода. Я написал дизеринг для своей либы. А как читателю этой темы можно ознакомиться с кодом? Где ссылка на библиотеку? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
4x4x8 Автор темы 24 Опубликовано: 15 сентября, 2022 1 час назад, eu_tomat сказал: А как читателю этой темы можно ознакомиться с кодом? Где ссылка на библиотеку? Код: -- floyd steinberg dither -- function Dither.floyd_steinberg_dither(matrix, bool_matrix, width, height) for y=1, height-1 do for x=2, width-1 do local old_r,old_g,old_b = colors.toRGB(matrix[y][x]) --old_r,old_g,old_b = Dither.greyscale_pixel(old_r,old_g,old_b) local factor = 3 local new_r = CEIL(factor * old_r / 255) * (255 / factor) local new_g = CEIL(factor * old_g / 255) * (255 / factor) local new_b = CEIL(factor * old_b / 255) * (255 / factor) new_r,new_g,new_b = math.floor(new_r), math.floor(new_g), math.floor(new_b) matrix[y][x] = colors.fromRGB(new_r,new_g,new_b) bool_matrix[CEIL(y/3)][CEIL(x/2)] = true local err_r = old_r - new_r local err_g = old_g - new_g local err_b = old_b - new_b local index_x, index_y = x+1, y local c_r, c_g, c_b = colors.toRGB(matrix[index_y][index_x]) c_r = c_r + err_r * 7/16.0 c_g = c_g + err_g * 7/16.0 c_b = c_b + err_b * 7/16.0 matrix[index_y][index_x] = colors.fromRGB(c_r, c_g, c_b) bool_matrix[CEIL(index_y/3)][CEIL(index_x/2)] = true index_x, index_y = x-1, y+1 c_r, c_g, c_b = colors.toRGB(matrix[index_y][index_x]) c_r = c_r + err_r * 3/16.0 c_g = c_g + err_g * 3/16.0 c_b = c_b + err_b * 3/16.0 matrix[index_y][index_x] = colors.fromRGB(c_r, c_g, c_b) bool_matrix[CEIL(index_y/3)][CEIL(index_x/2)] = true index_x, index_y = x, y+1 c_r, c_g, c_b = colors.toRGB(matrix[index_y][index_x]) c_r = c_r + err_r * 5/16.0 c_g = c_g + err_g * 5/16.0 c_b = c_b + err_b * 5/16.0 matrix[index_y][index_x] = colors.fromRGB(c_r, c_g, c_b) bool_matrix[CEIL(index_y/3)][CEIL(index_x/2)] = true index_x, index_y = x+1, y+1 c_r, c_g, c_b = colors.toRGB(matrix[index_y][index_x]) c_r = c_r + err_r * 1/16.0 c_g = c_g + err_g * 1/16.0 c_b = c_b + err_b * 1/16.0 matrix[index_y][index_x] = colors.fromRGB(c_r, c_g, c_b) bool_matrix[CEIL(index_y/3)][CEIL(index_x/2)] = true --[[ [y+1][x ] [y+1][x+1] ]] end end return matrix, bool_matrix end colors взял отсюда: https://www.computercraft.info/forums2/index.php?/topic/23048-rgb-api-convert-rgb-colors-to-computercraft-colors-and-back/ 3 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
4x4x8 Автор темы 24 Опубликовано: 15 сентября, 2022 14 часа назад, 4x4x8 сказал: Потратив более 8 часов беспрерывного кода. Я написал дизеринг для своей либы. К сожалению этот метод ОЧЕНЬ долгий. Я напишу другой метод, в итоге будет два метода, в теории второй метод должен быть быстрее. До: После(используется несколько значений факторов) Вот и второй алгоритм: Куда быстрее предыдущего, но имеет только черно-белые цвета -- ordered bayer dither -- local threshold_map = { {0, 8, 2, 10}, {12, 4, 14, 6}, {3, 11, 1, 9}, {15, 7, 13, 5} } function Dither.ordered_bayer_dither(matrix, bool_matrix, width, height) for y=1, height-1 do for x=2, width-1 do local grey = Dither.greyscale_pixel(colors.toRGB(matrix[y][x])) grey = grey / Dither.MAX_COLOR -- Dither.MAX_COLOR is 255 if grey < threshold_map[(y%4)+1][(x%4)+1] * (1/16) then matrix[y][x] = colors.black bool_matrix[CEIL(y/3)][CEIL(x/2)] = true else matrix[y][x] = colors.white bool_matrix[CEIL(y/3)][CEIL(x/2)] = true end end end return matrix, bool_matrix end 4 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах