Я новичок в использовании PHP-GD для изображений, я сделал только пару очень простых с этим все в порядке.
Я создаю генератор карт, который будет иметь более 3 масштабов в качестве холстов GD. Каждый масштаб представляет собой увеличение предыдущего масштаба и добавление дополнительных деталей. Первый масштаб представляет собой изображение размером 20x20 с наземными и акварельными красками. Второй масштаб имеет размер 60x60 пикселей (каждый пиксель превращается в сетку пикселей 3x3) и выполняет некоторую интерполяцию для округления пикселей первого масштаба.
Все работает нормально, кроме PHP. похоже, не предоставляет никакого способа повторного использования и ссылки на цвета в нескольких изображениях. Моя генерация карты полностью основана на цвете пикселей, считываемых с холста изображения. Я хочу использовать одни и те же цвета во всех трех масштабах моей карты, но мне приходится создавать эти глупые «ссылки на цвета», возвращаемые функцией imagecolorallocate(). Для полноцветных изображений не существует палитр, вы просто можете использовать любой цвет, какой захотите. Почему PHP не поддерживает правильные цветные изображения без палитр?
Мне нужно иметь возможность делать следующее:
< ul>
[*]Проверьте цвета пикселей во всех трех моих холстах GD, чтобы увидеть, соответствуют ли они определенному списку цветов (земля, вода и т. д.).
[*]Нарисуйте пиксели в любом из 3-х холстов GD используя один и тот же список цветов (земля, вода и т.д.)
Ищу способ избежать повторения переменные для каждого цвета, как у меня сейчас:
Код: Выделить всё
$Colour_Water_1 = imagecolorallocate($Scale_1, 68, 97, 147);
$Colour_Land_1 = imagecolorallocate($Scale_1, 99, 67, 33);
$Colour_Water_2 = imagecolorallocate($Scale_2, 68, 97, 147);
$Colour_Land_2 = imagecolorallocate($Scale_2, 99, 67, 33);
Идеальным вариантом был бы один глобальный массив цветов, который можно было бы использовать на каждом холсте GD:
Код: Выделить всё
$Map_Colours = array(
"Water" => array(68, 97, 147),
"Land" => array(99, 67, 33),
);
Я рассматривал возможность создания одного гигантского холста с тремя меньшими изображениями, нарисованными в разных местах гигантского холста, что позволяет избежать использования нескольких палитр, но это неидеально и в некотором роде глупо, и будет все более и более расточительно, поскольку я продолжаю добавлять все более масштабные масштабы в свой генератор карт.
Для меня не имеет значения, если изображения карты имеют настоящий цвет или палитру. Изначально я создавал изображения на основе палитр, но как только я понял, что используемые палитры не одинаковы на разных холстах GD, и я не могу ссылаться на одни и те же цвета на каждом холсте, эта идея развалилась. Затем я переключился на изображения с настоящим цветом, потому что думал, что они «просто будут работать», поскольку у меня нет внутренней палитры, но PHP GD по-прежнему требует использования imagecolorallocate() для изображений с настоящим цветом!Я нашел функцию imagepalettecopy(), но у нее та же проблема: для каждого холста требуются свои собственные переменные ссылки на цвет.
Я также нашел это комментарий на php.net, в котором говорилось, что вы можете ссылаться на любой цвет в полноцветном изображении, как если бы он уже был выделен, но предоставленный ими код был мне не очень понятен:
Код: Выделить всё
jessiedeer at hotmail dot com - 11 years ago
There is no need to allocate colors with imagecreatetruecolor. All [256 x 256 x 256 x 128] true colors are already allocated, and you can use the color indexes directly.
Examples :
Blue => color index 255.
White => color index 16777215 (= 255*256² + 255*256+255).
Full transparent => color index 2130706432 (= 127*256^3).
Код: Выделить всё
(Red) + (Green * 256) + (Blue * 65536)
Если этот метод работает с использованием правильной формулы, его также необходимо будет использовать при проверке пикселя на холсте, чтобы увидеть, соответствует ли он определенному цвету (земля, вода и т. д.).
Подробнее здесь: https://stackoverflow.com/questions/791 ... ses-images
Мобильная версия