旋转后获取新图像尺寸

时间:2013-12-12 10:13:47

标签: php rotation gd

我正在使用gd库旋转图像。 $_POST['rotation']给出旋转度。 $imagen是包含getWidth()setWidth()getHeight()setHeight()setError()方法的图片实例:

//Get the new width and height
$x = floor( abs($imagen->getWidth() * cos(deg2rad($_POST['rotation']))) ) + floor( abs($imagen->getHeight() * sin(deg2rad($_POST['rotation']))) );
$y = floor( abs($imagen->getWidth() * sin(deg2rad($_POST['rotation']))) ) + floor( abs($imagen->getHeight() * cos(deg2rad($_POST['rotation']))) );

//Set the new width and height          
$imagen->setHeight($y);
$imagen->setWidth($x);

//Rotate image
if(!$canvas = imagerotate ($canvas, $_POST['rotation'], 0)) $imagen->setError('Error rotating');

问题是有时$x$y变量没有正确的值。 例如。如果我旋转100º,我得到$x = 2364,但画布宽度是2362。

我做错了什么?

更新

我尝试将abs替换为floor,反之亦然,并得到奇怪的结果:

echo 'abs(floor) = '. (abs( floor($imagen->getAncho() * cos(deg2rad($_POST['rotacion']))) ) + abs( floor($imagen->getAlto() * sin(deg2rad($_POST['rotacion']))) ));
echo 'floor(abs) = '.(floor(abs($imagen->getAncho() * cos(deg2rad($_POST['rotacion']))) )+ floor(abs($imagen->getAlto() * sin(deg2rad($_POST['rotacion'])))));

结果:

abs(floor) = 2365 floor(abs) = 2364

我真的不明白为什么abs()会改变价值。 无论如何,实际值比floor(abs)值小2个像素。

2 个答案:

答案 0 :(得分:0)

问题是您使用的是floor。相反,您应该使用ceil,它会向上舍入数字。由于你将2个数字向下舍入(地板),你可以错过2个像素。

即。 2.5像素需要显示3个像素,而不仅仅是2个

答案 1 :(得分:0)

实际上,我没有理解下面的行为,但我发现了一个更简单的解决方案:获取画布大小,而不是计算它:

if(!$canvas = imagerotate ($canvas, $_POST['rotation'], 0)) $imagen->setError('Error rotating');
//Set the new width and height          
$imagen -> setHeight( imagesy( $canvas ) );
$imagen -> setWidth( imagesx( $canvas ) );

那就是全部!