在电商网站和社交网站或者新闻网站中,为了更快的加载网页和图片,通常会在商品列表或头像等地方使用缩略图。现在的手机和相机的像素都比较高,1张照片基本都在 4M 以上,如果每一个地方都加载原图的话,等待所有图片加载完成的时间,估计用户都可以打一局游戏了。而且国内大多数低配的服务器的带宽只有 1 - 2M,所以缩小图片体积就显得尤为重要了。

代码

PHP代码:

<?php

$fileName = 'img/image.jpg';  //  文件名

$fileInfo = getimagesize($fileName);  //  获取图片信息

list($srcW, $srcH) = $fileInfo;  //  把原始图片的宽度和高度传给单独的变量

$dstW = 100;  //  新画布的宽度
$dstH = 100;  //  新画布的高度

//  新建画布
$dstImage = imagecreatetruecolor($dstW, $dstH);

//  创建原始图片画布
$srcImage = imagecreatefromjpeg($fileName);

//  拷贝图片到新画布
imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $dstW, $dstH, $srcW, $srcH);

//  保存jpg图片
imagejpeg($dstImage, 'img/new_image.jpg');

//  销毁画布
imagedestroy($srcImage);
imagedestroy($dstImage);

说明

下面是一些函数说明:

getimagesize(string $fileName) 获取图片大小,接收一个图片文件名,返回包含图片大小的数组,如果无法获取会返回false,这个函数也可以用来判断是否是真实图片。

imagecreatetruecolor(int $width, int $height) 新建一个真彩色图像,接收两个参数,分别是宽度和高度,返回一个图像标识符,代表了一幅大小为 x_sizey_size 的黑色图像。

imagecreatefromjpeg(string $fileName) 由文件或 URL 创建一个新图象,接收一个文件 url,返回一图像标识符,代表了从给定的文件名取得的图像。

imagecopyresampled(resource $dstImage, resource $srcImage, int $dstX, int $dstY, int $srcX , int $srcY, int $dstW, int $dstH, int $srcW , int $srcH) 重采样拷贝部分图像并调整大小,这个函数的参数较多,下面是参数说明:

参数类型说明
dstImageresource目标图象连接资源
srcImageresource源图象连接资源
dstXint目标 X 坐标点,也就是粘贴图像的X起始位置
dstYint目标 Y 坐标点,也就是粘贴图像的Y起始位置
srcXint源的 X 坐标点,也就是拷贝图像的X起始位置
srcYint源的 Y 坐标点,也就是拷贝图像的Y起始位置
dstWint目标宽度,也就是粘贴图像的宽度
dstHint目标高度,也就是粘贴图像的高度
srcWint源图象的宽度,也就是拷贝图像的宽度
srcHint源图象的高度,也就是拷贝图像的高度

如果成功会返回 true,失败会返回 false

imagejpeg(resource $image, string $fileName, int $quality) 输出图象到浏览器或文件,下面是参数说明:

参数类型说明
imageresource由图象创建函数(例如 imagecreatetruecolor()) 返回的图象资源
fileNamestring文件保存的路径,如果未设置或为 NULL,将会直接输出原始图象流,如果要省略这个参数而提供 quality 参数,使用 NULL
qualityint图片质量,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。默认为 IJG 默认的质量值(大约 75)

成功时返回 true, 或者在失败时返回 false

imagedestroy(resource $image) 释放与 image 关联的内存。image 是由图像创建函数返回的图像标识符,例如 imagecreatetruecolor()

这里因为只是简单掩饰,所以新画布的宽度和高度是固定的,如果遇到原图片和新画布的宽高比不一样的话,图片会被强制拉升。如果不想强制拉升图片,又要限制图片的比例的话,可以用 javascript 来写一个选择图片范围的程序,当用户上传图片的时候在图片上面会有一个方框可以让用户拖拽选择范围,选择完成后在把参数发送到服务器,由 PHP 根据参数来拷贝图片。