2012-10-11 203 views
-2

我需要手动查找新图像的DPI。PHP调整图像大小保持高宽比

$input_width = 361; 
$input_height = 413; 

$input_dpi_x = 72; 
$input_dpi_y = 72; 

$output_width = 800; 
$output_height = $input_height * $output_width/$input_width; 

$output_dpi_x = ceil(($input_dpi_x/$input_width) * $output_width); 
$output_dpi_y = ceil(($input_dpi_y/$input_height) * $output_y_res); 

echo "Outpud_dpi_x = " . $output_dpi_x; 
//Outpud_dpi_x = 160 

为什么当我调整图像我得到802而不是800?

,我必须使用DPI不要问为什么

+0

我会在分割前进行乘法运算以避免精度损失,但是对于您所说的数字,这是一个非常大的舍入误差 – Basic

+0

您能否准确告诉我您的意思是我不是匹配人。 –

+0

您的标题要求保持图像的宽高比,但您的问题是关于计算DPI。有没有不同的方式来解决问题,以便我们提供解决方案? – jheddings

回答

0

答案是所有的数学......我们只专注于宽度为简单起见。

将图层拉回一点,从缩放操作开始(重新排序以帮助降低精度)。在这里,我正在计算输出DPI值并通过求解$output_width的原始公式来验证结果。

$output_dpi_x = $output_width * $input_dpi_x/$input_width; // 159.5567867... 
$output_width = $output_dpi_x * $input_width/$input_dpi_x; // 800 

你可以看到这个DPI的非校正值,我们回到800为宽度值。当我们取整到下一个数字时(使用ceil运算符),它会改变结果。通过退绕的数学,我们可以看到,为什么你在输出端了802px:

$output_dpi_x = ceil($output_dpi_x); // 160 
$output_width = $output_dpi_x * $input_width/$input_dpi_x; // 802.22222222... 

当然,图像不能包含部分像素,让您的调整后的图像向下取整到802px。

+0

好吧,对于麻烦的人来说,问题在于我在设置大小后将图像用于trim()函数,实际上我的公式是OK,但是我已经写得更好了。 Imagick Extension –

相关问题