Get palette of image
Потребовалось получать палитру с заданного изображения, программно естественно. Получить 1 цвет совсем не сложно. Нужно всего лишь сжать картинку до 1 пикселя и получите среднее значение цвета.
А вот рассчитать произвольное количество цветов задача не тривиальная. Долго искал информацию по этому вопросу, наконец, нашел Формулу цветового отличия, в частности CIEDE2000. Готовые реализации этого алгоритма можно найти на просторах Интернета.Но результат, который он выдавал меня не вполне устроил.
Потом наткнулся на другой алгоритм - Квантования цвета (Color quantization). Нашел JavaScript-версию вот здесь.
Но JS меня совсем не устраивал, потому как ставить Node.JS для одной задачи не хотелось. Поэтому я переписал скрипт на PHP, исходники которого выложу позже. Но PHP не самый лучший вариант из-за организации памяти:
Ubuntu x86:- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
$ uname -a
Linux jonel 2.6.32-48-generic #110-Ubuntu SMP Fri May 31 19:05:31 UTC 2013 i686 GNU/Linux
$ php palette.php
Amount of memory (empty array): 0.5 Mb
Amount of memory (full array): 1069 Mb
Size of Image: 1920 x 1080
Count pixels: 2073600
Start Script: 0.5 Mb
Peak of memory: 1198 MbDebian x86-64:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
$ uname -a
Linux jonel 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64 GNU/Linux
$ php palette.php
Amount of memory (empty array): 11 Mb
Amount of memory (full array): 2068.75 Mb
Size of Image: 1920 x 1080
Count pixels: 2073600
Start Script: 1 Mb
Peak of memory: 2326.75 MbКак видно, это всего лишь Full HD изображения.
Для расчета создается немаленький массив, размер которого зависит от разрешения изображения. На каждый пиксель по 3 значения, если не учитывать alpha-канал, т.е. width * height * 3.
Можно было бы разделить на несколько блоков и т.п., тем самым уменьшить потребление памяти. Но чем переписывать все на этом же PHP, лучше написать на C. Что гораздо интереснее и намного быстрее будет работать. На сайте Leptonica есть исходники, конечно, но они там настолько общие и громадные... Так что решил переписать самостоятельно под одну задачу.06 июля 2013 | Рубрика: Программирование
Раздел
Календарь
-
Сегодня
17 Марта 2026, ВторникПН ВТ СР ЧТ ПТ СБ ВС 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31