在PHP中调整大小后转换x,y坐标

时间:2011-12-06 02:59:17

标签: php math gd

这是一个非常复杂且令人头疼的问题,所以请仔细阅读,不要只是浏览。谢谢!

我正在从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,width&小图像的高度在背景图像上的正确位置。

我这样做:

$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轴)。

我几天都在盯着这些价值观并重写了几次。这一次对我来说都很完美。我不明白什么是错的。

1 个答案:

答案 0 :(得分:1)

如果我正确理解数学,这就是发生的事情:

您有$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;

这最终会返回一个笨拙的任意数字(x为150,y为100),我找不到任何可能的用途。

然后继续使用该值来计算小图像的新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做同样的事情。

我不知道这是否有效,但我希望如此。祝你好运!