Перейти к содержимому
ECS

ColorLib: библиотека для работы с цветом

Рекомендуемые сообщения

ab3f7505e192d151f4ff8b85b5568cb2.png

 

Хочу поделиться с вами крайне полезной в быту библитекой, которую мы с товарищами используем повсеместно. Она позволяет работать с несколькими цветовыми моделями: стандартной RGB, более современной HSB, преобразовывать их в HEX-цвет для OpenComputers и наоборот. Кроме того, она позволяет сжимать 24-битный цвет вида 0xFFFFFF до 8-битного вида 0xFF без потери качества.

 

Команда для загрузки:

wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/colorlib.lua lib/colorlib.lua -f

Методы

 

 

 

 

colorlib.HEXtoRGBint HEX-цвет ): int красный, int зеленый, int синий

     

     Преобразует шестнадцатеричный цвет вида 0xFFFFFF в три цветовых канала.

     К примеру, colorlib.HEXtoRGB(0xFF00FF) выдаст 255, 0, 255.

 

colorlib.RGBtoHEXint красный, int зеленый, int синий ): int HEX-цвет

     

     Преобразует три цветовых канала в стандартный шестнадцатеричный цвет.

     К примеру, colorlib.RGBtoHEX(0, 255, 0) выдаст 0x00FF00.

 

colorlib.RGBtoHSBint красный, int зеленый, int синий ): int тон, int насыщенность, int яркость

     

     Преобразует три цветовых канала в цвет три параметра цветовой схемы HSB.

     К примеру, colorlib.RGBtoHSB(255, 0, 0) выдаст 360, 100, 100.

 

colorlib.HSBtoRGBint тон, int насыщенность, int яркость ): int красный, int зеленый, int синий

     

     Преобразует три параметра цветовой схемы HSB в три параметра цветовой палитры RGB.

     К примеру, colorlib.HSBtoRGB(200, 50, 50) выдаст 63, 126, 127.

 

colorlib.HEXtoHSBint HEX-цвет ): int тон, int насыщенность, int яркость

     

     Преобразует цвет вида 0xFFFFFF в три параметра цветовой схемы HSB.

     К примеру, colorlib.HEXtoHSB(0xFF0000) выдаст 360, 0, 0.

 

colorlib.alphaBlend int первый цвет, int второй цвет, int прозрачность ): int HEX-цвет

     

     Накладывает второй цвет на первый с учетом прозрачности второго. Прозрачность -

     это число в диапазоне от 0 до 255.) С помощью этого метода можно получить красивую симуляцию прозрачности:

 

     67f84178db9a3958a3c7df72eccd19e9.png

 

 

colorlib.convert24BitTo8Bitint 24-битный HEX-цвет ): int 8-битный HEX-цвет

     

     Сжимает цвет вида 0xFFFFFF до цвета вида 0xFF без потери качества при отображении

     на мониторах OpenComputers. Крайне полезный метод, когда необходимо экономимть

     дисковое пространство или оперативную память.

 

colorlib.convert8BitTo24Bitint 8-битный HEX-цвет ): int 24-битный HEX-цвет

     

     Распаковывает цвет вида 0xFF до цвета вида 0xFFFFFF. По сути это обратная конвертация

     цвета из предыдущего метода. Необходимо вызывать его перед отрисовкой.

 

 

 

Изменено пользователем ECS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как я понял, преобразование convert24BitTo8Bit осуществляется путем перебора массива стандартных цветов с целью поиска ближайшего. А нельзя ли для этого использовать дихотомию?

И еще, если сделать так:

local palette = {
  [0]=0x000000, 0x000040, ...
}

то можно избавиться от -1 +1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

то можно избавиться от -1 +1

 

-1 и +1 необходимы для наших файловых форматов. Вчера писали новый формат изображения, для записи в файл требуются корректные индексы. А если добавлять [0] в тот массив, то увеличится размер скачиваемого файла, поэтому мы не стали париться и сделали -1 +1, так проще и удобнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Странно, что отсутствует элементарная функция "обратить цвет". Или например переводчик в чб тона.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Странно, что отсутствует элементарная функция "обратить цвет". Или например переводчик в чб тона.

 

Для этого у нас имеется либа image, где реализовано все, что только душе угодно. Там тебе и яркость, и контрастность, и насыщенность, и цветовой тон, и повороты-отражения, и инверсия. ColorLib же нужна именно для базовых операций над цветом, т.е. это основа для более крутых и потных вещей, таких как image. Надо будет, кстати, расписать ее у вас на форуме, полезная штука.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как я понял, преобразование convert24BitTo8Bit осуществляется путем перебора массива стандартных цветов с целью поиска ближайшего. А нельзя ли для этого использовать дихотомию?

И еще, если сделать так:

local palette = {
  [0]=0x000000, 0x000040, ...
}

то можно избавиться от -1 +1

Нет. Тут немного не так. Требуется найти наиболее близкий по оттенку цвет к нужному, а не просто ближайший к нему цвет. Если начать искать ближайший цвет, то получится "немного" странные оттенки. Например я задам темнозеленый, а мне вернет непонятный оттенок красного.

 

И да, эта функция очень медленная... Как ускорить ее мы не знаем. Простой поиск близкого по значению цвета дает не те результаты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не совсем понятна разница между "наиболее близкий по оттенку" и "ближайший цвет".

Если представить цвет как точку в трехмерном пространстве, то искомым цветом будет стандартный цвет, лежащий на минимальном расстоянии от заданного. Именно это "расстояние" сохраняется в переменной colorMatchFactor. Зачем, правда, коэффициенты paletteTypeRed, paletteTypeGreen, paletteTypeBlue = 3, 3, 2 ?

А вот можно ли проводить поиск не полным перебором, а как то более оптимально, надо подумать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для этого у нас имеется либа image, где реализовано все, что только душе угодно. Там тебе и яркость, и контрастность, и насыщенность, и цветовой тон, и повороты-отражения, и инверсия. ColorLib же нужна именно для базовых операций над цветом, т.е. это основа для более крутых и потных вещей, таких как image. Надо будет, кстати, расписать ее у вас на форуме, полезная штука.

Мда, посмотришь на весь проделанный труд и писать библиотеки желание пропадает. Как много полезных функций.

Я то думал как раз вчера, написать библиотеку работы с цветами или дописывать игру Куб. Выбрал второе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Мда, посмотришь на весь проделанный труд и писать библиотеки желание пропадает. Как много полезных функций. Я то думал как раз вчера, написать библиотеку работы с цветами или дописывать игру Куб. Выбрал второе.
 

 

Вот и правильно, библиотек хоть жопой жуй, а игр - раз, два и обчелся. Нужно больше игр!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...