ECS 1 904 Опубликовано: 12 января, 2016 (изменено) Хочу поделиться с вами крайне полезной в быту библитекой, которую мы с товарищами используем повсеместно. Она позволяет работать с несколькими цветовыми моделями: стандартной RGB, более современной HSB, преобразовывать их в HEX-цвет для OpenComputers и наоборот. Кроме того, она позволяет сжимать 24-битный цвет вида 0xFFFFFF до 8-битного вида 0xFF без потери качества. Команда для загрузки: wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/colorlib.lua lib/colorlib.lua -f Методы colorlib.HEXtoRGB( int HEX-цвет ): int красный, int зеленый, int синий Преобразует шестнадцатеричный цвет вида 0xFFFFFF в три цветовых канала. К примеру, colorlib.HEXtoRGB(0xFF00FF) выдаст 255, 0, 255. colorlib.RGBtoHEX( int красный, int зеленый, int синий ): int HEX-цвет Преобразует три цветовых канала в стандартный шестнадцатеричный цвет. К примеру, colorlib.RGBtoHEX(0, 255, 0) выдаст 0x00FF00. colorlib.RGBtoHSB( int красный, int зеленый, int синий ): int тон, int насыщенность, int яркость Преобразует три цветовых канала в цвет три параметра цветовой схемы HSB. К примеру, colorlib.RGBtoHSB(255, 0, 0) выдаст 360, 100, 100. colorlib.HSBtoRGB( int тон, int насыщенность, int яркость ): int красный, int зеленый, int синий Преобразует три параметра цветовой схемы HSB в три параметра цветовой палитры RGB. К примеру, colorlib.HSBtoRGB(200, 50, 50) выдаст 63, 126, 127. colorlib.HEXtoHSB( int HEX-цвет ): int тон, int насыщенность, int яркость Преобразует цвет вида 0xFFFFFF в три параметра цветовой схемы HSB. К примеру, colorlib.HEXtoHSB(0xFF0000) выдаст 360, 0, 0. colorlib.alphaBlend( int первый цвет, int второй цвет, int прозрачность ): int HEX-цвет Накладывает второй цвет на первый с учетом прозрачности второго. Прозрачность - это число в диапазоне от 0 до 255.) С помощью этого метода можно получить красивую симуляцию прозрачности: colorlib.convert24BitTo8Bit( int 24-битный HEX-цвет ): int 8-битный HEX-цвет Сжимает цвет вида 0xFFFFFF до цвета вида 0xFF без потери качества при отображении на мониторах OpenComputers. Крайне полезный метод, когда необходимо экономимть дисковое пространство или оперативную память. colorlib.convert8BitTo24Bit( int 8-битный HEX-цвет ): int 24-битный HEX-цвет Распаковывает цвет вида 0xFF до цвета вида 0xFFFFFF. По сути это обратная конвертация цвета из предыдущего метода. Необходимо вызывать его перед отрисовкой. Изменено 12 января, 2016 пользователем ECS 6 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 12 января, 2016 Как я понял, преобразование convert24BitTo8Bit осуществляется путем перебора массива стандартных цветов с целью поиска ближайшего. А нельзя ли для этого использовать дихотомию? И еще, если сделать так: local palette = { [0]=0x000000, 0x000040, ... } то можно избавиться от -1 +1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 904 Опубликовано: 12 января, 2016 то можно избавиться от -1 +1 -1 и +1 необходимы для наших файловых форматов. Вчера писали новый формат изображения, для записи в файл требуются корректные индексы. А если добавлять [0] в тот массив, то увеличится размер скачиваемого файла, поэтому мы не стали париться и сделали -1 +1, так проще и удобнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 12 января, 2016 Странно, что отсутствует элементарная функция "обратить цвет". Или например переводчик в чб тона. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 904 Опубликовано: 12 января, 2016 Странно, что отсутствует элементарная функция "обратить цвет". Или например переводчик в чб тона. Для этого у нас имеется либа image, где реализовано все, что только душе угодно. Там тебе и яркость, и контрастность, и насыщенность, и цветовой тон, и повороты-отражения, и инверсия. ColorLib же нужна именно для базовых операций над цветом, т.е. это основа для более крутых и потных вещей, таких как image. Надо будет, кстати, расписать ее у вас на форуме, полезная штука. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
JaggerDer 90 Опубликовано: 12 января, 2016 Как я понял, преобразование convert24BitTo8Bit осуществляется путем перебора массива стандартных цветов с целью поиска ближайшего. А нельзя ли для этого использовать дихотомию? И еще, если сделать так: local palette = { [0]=0x000000, 0x000040, ... } то можно избавиться от -1 +1 Нет. Тут немного не так. Требуется найти наиболее близкий по оттенку цвет к нужному, а не просто ближайший к нему цвет. Если начать искать ближайший цвет, то получится "немного" странные оттенки. Например я задам темнозеленый, а мне вернет непонятный оттенок красного. И да, эта функция очень медленная... Как ускорить ее мы не знаем. Простой поиск близкого по значению цвета дает не те результаты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 12 января, 2016 Не совсем понятна разница между "наиболее близкий по оттенку" и "ближайший цвет". Если представить цвет как точку в трехмерном пространстве, то искомым цветом будет стандартный цвет, лежащий на минимальном расстоянии от заданного. Именно это "расстояние" сохраняется в переменной colorMatchFactor. Зачем, правда, коэффициенты paletteTypeRed, paletteTypeGreen, paletteTypeBlue = 3, 3, 2 ? А вот можно ли проводить поиск не полным перебором, а как то более оптимально, надо подумать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 12 января, 2016 Для этого у нас имеется либа image, где реализовано все, что только душе угодно. Там тебе и яркость, и контрастность, и насыщенность, и цветовой тон, и повороты-отражения, и инверсия. ColorLib же нужна именно для базовых операций над цветом, т.е. это основа для более крутых и потных вещей, таких как image. Надо будет, кстати, расписать ее у вас на форуме, полезная штука. Мда, посмотришь на весь проделанный труд и писать библиотеки желание пропадает. Как много полезных функций. Я то думал как раз вчера, написать библиотеку работы с цветами или дописывать игру Куб. Выбрал второе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 904 Опубликовано: 12 января, 2016 Мда, посмотришь на весь проделанный труд и писать библиотеки желание пропадает. Как много полезных функций. Я то думал как раз вчера, написать библиотеку работы с цветами или дописывать игру Куб. Выбрал второе. Вот и правильно, библиотек хоть жопой жуй, а игр - раз, два и обчелся. Нужно больше игр! 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах