PHP调整图像大小,使纵横比保持精确大小
我需要手动查找新图像的DPIPHP调整图像大小,使纵横比保持精确大小,php,image-resizing,aspect-ratio,Php,Image Resizing,Aspect Ratio,我需要手动查找新图像的DPI $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);
$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不要问为什么答案全在数学上。。。为了简单起见,让我们只关注宽度 稍微拉回图层,从缩放操作开始(重新排序以帮助降低精度)。这里,我正在计算输出DPI值,并通过求解
$output\u 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。我会在除法之前执行乘法,以避免精度损失,但使用您所说的数字,这是一个相当大的舍入错误。你能告诉我你的确切意思吗?我不是一个匹配的人。你的标题是要求保持图像的纵横比,但你的问题是关于计算DPI。是否有其他方式来表述问题,以便我们提供解决方案?如果您使用
round()
而不是ceil()
?这是否用于某种打印格式?我不知道任何图像格式,允许不同的dpi的高度和宽度,他们应该是相同的。。。对于屏幕上的图像,dpi是完全不相关的,只有#个像素每面才重要。好吧,为麻烦的人们感到抱歉,问题是我在设置大小后对图像使用了trim()函数,这弄乱了大小,实际上我的公式还可以,但我已经编写了一个更好的公式。Imagick扩展