【问题标题】:PHP resize image keeping aspect ratio to exact sizePHP将图像大小调整为保持纵横比精确大小
【发布时间】:2012-10-02 17:32:43
【问题描述】:

我需要手动查找新图像的 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。是否有不同的方式来表达问题,以便我们提供解决方案?
  • 如果您使用round() 而不是ceil() 会怎样?
  • 这是某种打印格式吗?我不知道任何允许不同 dpi 的高度和宽度的图像格式,它们应该是相同的......对于屏幕上的图像是 dpi 完全无关的,每边只有 # 个像素。

标签: php image-resizing aspect-ratio


【解决方案1】:

答案全在数学上……为简单起见,我们只关注宽度。

稍微拉回层,从缩放操作开始(重新排序以帮助降低精度)。在这里,我正在计算输出 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...

当然,图片不能包含部分像素,因此调整后的图片会向下舍入为 802 像素。

【讨论】:

  • 好吧,对不起,麻烦的人,问题是我在设置尺寸后对图像使用了 trim() 函数,这弄乱了尺寸,实际上我的公式还可以,但是我已经写了一个更好的. Imagick 扩展
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 2012-04-15
  • 2012-05-01
  • 2012-11-15
相关资源
最近更新 更多