Сейчас я занимаюсь разработкой редактора веб-изображений, я разрешаю пользователям создавать рисунки с помощью JavaScript, и мне нужно экспортировать результат в PHP. Я использую PHP-GD для генерации результатов.
Сейчас я работаю над аффинными преобразованиями. У пользователей есть рабочее пространство с заданными размерами. В iOS, Android и JavaScript они могут импортировать изображение и перемещать его, масштабировать и поворачивать в любом месте рабочей области, и позиция сохраняется в качестве матрицы преобразования. Теперь PHP должен использовать эту аффинную матрицу преобразования, чтобы расположить каждый элемент в нужном месте и экспортировать одно объединенное изображение.
Я посмотрел в Imagick для аффинных преобразований, но поскольку документация не завершена, и я не получил никаких результатов, я использую GD и почти достигаю своей цели.
Сейчас я уверен, что не правильно использую аффинное преобразование, вот где мне нужна ваша помощь.
Вот что я делаю:
$source = imagecreatefrompng($image_path_server);
$background = imagescale($source, 500);
$arrow = imagecreatefrompng($arrow_path);
$affine = array(0.08470355177709013, 0.7807062203430081, -0.7807062203430081, 0.08470355177709013, 42.99999999999994, 199.00000000000006);
$arrow = imageaffine($arrow, $affine);
imagecopy($background, $arrow, 42.99999999999994, 199.00000000000006, 0, 0, imagesx($arrow), imagesy($arrow));
С помощью этого кода стрелка хорошо поворачивается и масштабируется, но положение не является правильным, и это, вероятно, потому, что изображение переформировано после аффинного преобразования.
В идеале, я бы хотел избежать использования imagecopy для позиционирования изображения, так как позиция определяется в матрице, но я не нашел, как применить матрицу к стрелке на основе фона.
Чтобы быть более точным, я хотел бы добавить свою стрелку в верхнем левом углу изображения в качестве слоя, а затем применить матрицу преобразования, чтобы она правильно позиционировалась на фоне. Когда я только применяю перевод ([1,0,0,1,200,250]), он не влияет на положение на заднем плане, и это именно то, что мне нужно здесь.
Кто-нибудь сталкивался с подобными операциями, чтобы направить меня в правильном направлении?
Задача ещё не решена.
Других решений пока нет …