Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP调整图像大小,使纵横比保持精确大小_Php_Image Resizing_Aspect Ratio - Fatal编程技术网

PHP调整图像大小,使纵横比保持精确大小

PHP调整图像大小,使纵横比保持精确大小,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);

我需要手动查找新图像的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);
$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扩展