使用 PHP 进行图片压缩,首先通过 imagecreatefrom* 系列函数创建源图像 resource 对象,再通过 imagecreate 或者 imagecreatetruecolor 函数创建确定宽度和高度的目标图像对象,接着进行一系列处理,最后通过 imagecopy* 系列函数把源图像对象拷贝到目标图像对象。完成上述处理之后,调用 imagegif、imagejpeg、imagepng 把目标图像对象转换为图像字符串输出到文件或者浏览器。似乎没有直接把图像对象转换为字符串的函数?可以通过 ob_start 捕获字符串输出,并调用 ob_get_clean 取得字符串。
imagecreatefrom* 系列函数
| imagecreatefromgd | 从 GD 文件或 URL 创建图像对象 |
| imagecreatefromgd2 | 从 GD2 文件或 URL 创建图像对象 |
| imagecreatefromgif | 从 gif 文件创建图像对象 |
| imagecreatefromjpeg | 从 jpeg/jpg 文件创建图像对象 |
| imagecreatefrompng | 从 png 文件创建图像对象 |
| imagecreatefromwbmp | 从 wbmp 文件创建图像对象 |
| imagecreatefromwebp | 从 webp 文件创建图像对象 |
| imagecreatefromxbm | 从 xbm 文件创建图像对象 |
| imagecreatefromxpm | 从 xpm 文件创建图像对象 |
| 上述所有函数全部接收一个参数 — $filename, 失败时均会返回 false | |
| imagecreatefromstring | 从字符串创建图像对象 |
| 接收一个参数 — 图像二进制字符串 | |
imagecopy* 系列函数
| imagecopy | 拷贝图像的一部分 |
| imagecopymerge | 拷贝并合并图像的一部分 |
| imagecopymergegray | 用灰度拷贝并合并图像的一部分 |
| imagecopyresampled | 重采样拷贝部分图像并调整大小 |
| imagecopyresized | 拷贝部分图像并调整大小 |
图片压缩实现代码
$image = 'D:\TEMP\woxinfeishi-bukezhuanye.jpg';
$source = imagecreatefromjpeg($image);
$s_width = imagesx($source);
$s_height = imagesy($source);
$max_width = 200;
$max_height = 200;
if ($s_width > $max_width
|| $s_height > $max_height)
{
$s_rate = $s_width / $s_height;
$t_rate = $max_width / $max_height;
if ($s_rate > $t_rate)
{
$t_width = $max_width;
$t_height = floor($t_width / $s_rate);
}
else
{
$t_height = $max_height;
$t_width = floor($t_height * $s_rate);
}
$target = imagecreatetruecolor($t_width,
$t_height);
imagecopyresampled($target, $source, 0, 0, 0, 0,
$t_width, $t_height,
$s_width, $s_height);
}
else
{
$target = $source;
}
ob_start();
imagejpeg($target);
$image_data = ob_get_clean(); // 图像数据
imagedestroy($source);
imagedestroy($target);
上述代码实现图片等比压缩,如果是缩放到固定高宽则只需要直接设置为最终高宽。
发表回复