doubingjian2006 2012-10-11 23:08

# PHP调整图像大小保持宽高比到精确大小

I need to manually find DPI of new image.

``````\$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
``````

Why when i resize image i get 802 instead of 800?

and i must use DPI dont ask why

• 写回答

#### 1条回答默认 最新

• douwendu2460 2012-10-12 13:44
关注

The answer is all in the math... Let's just focus on the width for simplicity.

Pulling back the layers a little bit, start with scaling operations (reordered to help with loss of precision). Here, I'm calculating the output DPI value and verifying the result by solving the original equation for `\$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
``````

You can see with this non-corrected value for DPI, we arrive back at 800 for the width value. When we round up to the next number (using the `ceil` operator), it changes the results. By unwinding the math, we can see why you end up with 802px in the output:

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

Of course, images can't contain partial pixels, so your resized image is rounded down to 802px.

本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

#### 悬赏问题

• ¥15 商城生产日期批次库存问题
• ¥15 esp8266控制共阳极wrgb灯板无法关闭所有led灯
• ¥100 python读取速度问题
• ¥15 stm32f407使用DMA问题
• ¥15 您好 这个API接口该怎么弄 网站搭建好了 API也有 现在就不知道该怎么填写API 不知道怎么用
• ¥88 用uniapp写一个多端的程序，用到高德地图，用高德的JSAPI吗？
• ¥20 关于#c++#的问题：水果店管理系统
• ¥30 dbLinq最新版linq sqlite
• ¥20 对D盘进行分盘之前没有将visual studio2022卸载掉，现在该如何下载回来
• ¥15 完成虚拟机环境配置，还有安装kettle