我正在使用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个像素。
答案 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 ) );
那就是全部!