Я создаю галерею изображений с использованием PHP и MySQL, где я хочу реализовать поиск изображений по его цвету . Следуя Imagick :: getImageHistogram, я получил самые представленные цвета из изображений.
<?php $image = new Imagick("thing.png"); $pixels=$image->getImageHistogram(); foreach($pixels as $p){ $colors = $p->getColor(); foreach($colors as $c){ print( "$c\t" ); } print( "\t:\t" . $p->getColorCount() . "\n" ); } ?> This will print out something like: Red Green Blue Alpha : No of times appeared 252 250 252 1 : 125 194 156 182 1 : 126 109 18 79 1 : 11440 2 117 162 1 : 12761 255 255 255 1 : 40769
Хотя я покончил с получением цветов, я застрял в разработке базы данных для хранения информации о цвете вместе с образом пути изображения в базе данных.
Мой вопрос заключается в том, как создать базу данных (структуру таблицы) для хранения такого рода данных, где запрос поиска может быть применен эффективным образом.
Обновить:
Во-вторых, как я могу получить изображения с соответствующим цветом. Предположим, что пользователь ищет цвет # ff0000, то как я могу получить все ближайшие согласованные изображения из базы данных.
Спасибо
Вы должны нормализовать это.
3 Таблицы:
Image {image_id, name} Colors {color_id, red, green, blue, alpha} ImageHasColor {image_id, color_id, number_of_times_appeared}
Вставка данных должна быть простой, используйте ...insert_id
функции ...insert_id
чтобы получить идентификатор из строки, которую вы только что вставили.
Выберите с помощью таких объединений, как:
SELECT * FROM Image i JOIN ImageHasColors h ON i.image_id = h.image_id JOIN Colors c ON c.color_id = h.color_id ORDER BY i.image_id
Проверьте эту ссылку о том, как преобразовать цвет HEX в значения RGB: http://bavotasan.com/2011/convert-hex-color-to-rgb-using-php/
Поиск топ-10 действительно красных картин:
SELECT * FROM Image i JOIN ImageHasColors h ON i.image_id = h.image_id JOIN Colors c ON c.color_id = h.color_id WHERE c.red > 200 AND c.green < 50 AND c. green < 50 ORDER BY h.number_of_times_appeared LIMIT 10
Поиск довольно черных изображений:
SELECT * FROM Image i JOIN ImageHasColors h ON i.image_id = h.image_id JOIN Colors c ON c.color_id = h.color_id WHERE c.red < 30 AND c.green < 30 AND c. green < 30 ORDER BY h.number_of_times_appeared LIMIT 10
Почему бы вам не создать таблицу базы данных со следующими полями:
Таблица изображений
id name red green blue alpha
Как насчет вас в первый раз все красные значения по количеству раз, когда они появились, а затем добавьте эти значения вместе, чтобы получить общее красное значение. Затем разделите на общее количество раз. Сделайте то же самое для зеленого и синего.
Например:
total red = ((252*125)+(194*126)+(109*11440)+(2*12761)+(255*40769)) / (125 + 126 + 11440 + 12761 + 40769) = 180
Затем просто сохраните их в базе данных, например
id red green blue image_path Image 1 1 225 134 4 /dir/ Image 2 2 143 0 145 /dir/ Image 3 3 239 200 111 /dir/
Если вы искали красные изображения, вы могли бы сделать что-то вроде:
SELECT id, image_path WHERE red > 200 AND blue < 100 AND green < 100
Я не уверен в специфике, но вы можете обходиться со значениями.