Конвертировать координаты x, y после изменения размера в PHP - PullRequest
1 голос
/ 06 декабря 2011

Это довольно сложный и изматывающий вопрос, поэтому, пожалуйста, внимательно прочитайте, а не просто просматривайте.Спасибо!

Я извлекаю изображения из файла PDF и перестраиваю изображение страницы.Это все работает, за исключением того, что я не могу получить координаты как раз для размещения маленьких изображений над большим фоновым изображением.

Я начинаю с чего-то вроде этого:

$page_width = 1000;
$page_height = 1500;
$back_img_x = 5
$back_img_y = 8
$back_img_width = 990;
$back_img_height = 1501;
$back_img_truewidth = 3000;
$back_img_trueheight = 4000;
$little_img_x = 550;
$little_img_y = 250;
$little_img_width = 200;
$little_img_height = 100;

Теперь, чтобы объяснить,заднее изображение не обязательно имеет тот же размер, что и страница, что означает, что оно масштабируется, оно также не обязательно находится в позиции 0,0, что связано с тем, кем был глупый человек, который первым сделал PDF (или какое приложение.)

Теперь я игнорирую размер страницы и пытаюсь отобразить маленькое изображение на заднем изображении в правильном положении после обрезки заднего изображения.

Так много сложных вещейтеперь выполняется обратное изображение, что приводит к следующему:

$trimleft = 100;
$trimright = 100;
$trimtop = 40;
$trimbottom = 120;
$margin_x = 50;
$margin_y = 35
$offset_x = 0;
$offset_y = 90;

Затем заднее изображение корректно обрезается и помещается на новый холст следующим образом:

$fullwidth=($trimright-$trimleft)+($margin_x*2);
$fullheight=($trimbottom-$trimtop)+($margin_y*2);
$trimmed=imagecreate($fullwidth,$fullheight);
imagefill($trimmed,0,0,imagecolorallocate($trimmed,255,255,255)); // make white
imagecopy($trimmed,$image,$margin_x+$offset_x,$margin_y+$offset_y,$trimleft,$trimtop,$trimright-$trimleft,$trimbottom-$trimtop);

Покахорошо ...

Теперь я хочу, чтобы x, y, ширина и высота маленького изображения были в правильном положении над фоновым изображением.

Я делаю тhis:

$little_img_width=($little_img_width/$back_img_width);
$little_img_height=($little_img_height/$back_img_height);
$little_img_x=(($little_img_x-$back_img_x)/$back_img_width)*$back_img_truewidth;
$little_img_y=(($little_img_y-$back_img_y)/$back_img_height)*$back_img_trueheight;

$little_img_width*=($back_img_truewidth/$fullwidth);
$little_img_height*=($back_img_trueheight/$fullheight);
$little_img_x=($little_img_x-$trimleft+$margin_x+$offset_x)/$fullwidth;
$little_img_y=($little_img_y-$trimtop+$margin_y+$offset_y)/$fullheight;

Это должно дать мне правильные x, y, ширину и высоту маленького изображения, правильно расположенного и измеренного на фоновом изображении (в процентах, где 0 далеко слева, а 1 далеко справа)и т. д.) Ширина / высота правильные, но координаты немного смещены.Это координата y, которая находится слишком низко на странице примерно на 5%.Обратите внимание, что $offset_x равно 0, что указывает на то, что проблема заключается в переменных смещения (поскольку $offset_x равно 0, ошибка позиционирования не отображается для оси x, только для оси y).

IВ течение нескольких дней я смотрел на эти значения и переписывал их все несколько раз.На этот раз все выглядит идеально для меня.Я не понимаю, что все еще не так.

1 Ответ

1 голос
/ 06 декабря 2011

Если я правильно понимаю математику, вот что происходит:

У вас есть $fullwidth и $fullheight, которые являются шириной и высотой, которую изображение будет занимать на вашем холсте.

Затем вы умножаете ширину и высоту меньшего изображения на отношение его размера к полному размеру исходного необработанного изображения.Что правильно.

Однако, когда вы вычисляете $little_img_x и $little_img_y, вы делаете это:

$little_img_x=(($little_img_x-$back_img_x)/$back_img_width)*$back_img_truewidth;
$little_img_y=(($little_img_y-$back_img_y)/$back_img_height)*$back_img_trueheight;

В результате получается неловко произвольное число (что-то вроде 150для x и 100 для y), для которого я не могу найти какое-либо возможное применение.

Затем вы продолжаете и используете это значение для вычисления новых x и y для небольшого изображения, что приведет к другомупроизвольное число, которое не имеет смысла.

Я предлагаю новый подход, в котором $little_img_x и $little_img_y рассчитываются следующим образом:

$little_img_x = ($little_img_x/$back_img_x)*$fullwidth + (($little_img_x-$trimleft+$margin_x+$offset_x) / $fullwidth)
$little_img_y = ($little_img_y/$back_img_y)*fullheight + (($little_img_y-$trimtop+$margin_y+$offset_y)/ $fullheight)

В основном мы берем оригинал маленького изображения x,получите его отношение к фону x, умножьте его на новую ширину, чтобы получить представленный x, а затем добавьте всю обработку смещения.Мы делаем то же самое с y.

Я понятия не имею, работает ли это, но я надеюсь, что это работает.Удачи!

...