本节示例通过编写PHP脚本实现对图像大小的任意调整。运行本例,可以先上传图片,然后在底部显示所有上传的图片,从中选择要调整图片的大小比例,然后单击“调整图像大小”按钮,重新刷新页面,就可以看到被调整后的图片大小,运行效果如图10.34所示.。
设计原理:首先,根据表单中提交的值,获取指定图片的存储路径和名称,以及它要被调整的比例。然后,应用getimagesize()函数获取指定图片的数据。接着,定义thumb()方法,根据原始图片的数据和提交的调整比例数据,判断是根据比例缩放,还是进行裁剪。最后,载入原始图片,并定义新的缩略图,应用ImageCopyResampled()函数将原始图像复制到新的缩略图中,并将新的图像存储到指定位置。

上传图片 预览图片

把原图调整为40%×
图10.34 调整上传图片
【操作步骤】
第1步,创建index.php文件。设计上传图片表单。
<form action="" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> <p>选择上传文件: <input type="file" name="up_picture"></p> <p>上传文件类型为(.jpg、.gif、.png、.bmp)</p> <p><input type="reset" name="reset" value="重 置"> <input type="submit" name="submit" value="上 传"></p> </form>
第2步,在当前文件中编写PHP脚本,创建一个图片上传功能,将图片上传到服务器指定的文件夹下。
<?php
if(!empty($_FILES['up_picture']['name'])){ //判断上传内容是否为空
$type=$_FILES['up_picture']['name'];
$types=strtolower(strstr($type,'.'));
if($types==".gif" || $types==".jpg" || $types==".png" || $types==".bmp"){
if($_FILES['up_picture']['error']>0){ //判断文件是否可以上传到服务器
echo "上传错误:";
switch($_FILES['up_picture']['error']){
case 1:
echo "上传文件大小超出配置文件规定值";
break;
case 2:
echo "上传文件大小超出表单中约定值";
break;
case 3:
echo "上传文件不全";
break;
case 4:
echo "没有上传文件";
break;
}
}else{
if(!is_dir("./upfile/")){ //判断指定目录是否存在
mkdir("./upfile/"); //创建目录
}
//定义上传文件名称和存储位置
$path='./upfile/'.time().strtolower(strstr($_FILES['up_picture']['name'],'.'));
//判断文件是否是HTPP POST上传
if(is_uploaded_file($_FILES['up_picture']['tmp_name'])){
//执行上传操作
if(!move_uploaded_file($_FILES['up_picture']['tmp_name'],$path)){
echo "上传失败";
}else{
echo "文件".$_FILES['up_picture']['name']."上传成功,大小为:".$_FILES['up_picture']['size'];
}
}else{
echo "上传文件".$_FILES['up_pictute']['name']."不合法!";
}
}
}else{
echo "上传文件".$_FILES['up_pictute']['name']."类型不正确!";
}
}
?>
第3步,在index.php底部编写PHP脚本,通过文件系统函数读取存储在指定目录下的图片。从上传文件目录中读取所有的上传图片,并显示在页面中,同时为每个图片绑定一个调整大小的表单,允许用户通过表单调整图片大小。提交图片的存储位置、名称和要调整的尺寸,将数据提交到index_ok.php文件中。
<?php
$list=opendir("./UPFILE/"); //打开目录
$i = 0;
while($read_list = readdir( $list )){ //读取目录
$i++ ;
$file_type=filetype("./UPFILE/".$read_list);
if($file_type=="file" && strstr($read_list,".")!=".db"){
$img_arr=getimagesize('./UPFILE/'.$read_list);
echo "<img src='./UPFILE/".$read_list."' width=\"200\" /> ";
$thumbnail_list=opendir ("./thumbnail/"); //打开目录
while ($th_list = readdir( $thumbnail_list )){ //读取目录
$i++ ;
$file_type=filetype("./thumbnail/".$th_list);
if($file_type=="file" && $th_list==$read_list && strstr($th_list,".")!=".db"){
echo "<img src='./thumbnail/".$th_list."'/> ";
}
}
?>
<form id="form1" name="form1" method="post" action="index_ok.php">
图像宽:
<input type="hidden" name="pic_path" value="./UPFILE/<?php echo $read_list;?>">
<input type="hidden" name="pic_name" value="<?php echo $read_list;?>">
<select name="pic_width" id="pic_width">
<option selected="selected" value="1"><?php echo $img_arr[0];?></option>
<option value="1">100%</option>
<option value="0.8">80%</option>
<option value="0.7">70%</option>
<option value="0.6">60%</option>
<option value="0.5">50%</option>
<option value="0.4">40%</option>
<option value="0.3">30%</option>
<option value="0.2">20%</option>
<option value="0.1">10%</option>
</select>
图像高:
<select name="pic_height" id="pic_height">
<option selected="selected" value="1"><?php echo $img_arr[1];?></option>
<option value="1">100%</option>
<option value="0.8">80%</option>
<option value="0.7">70%</option>
<option value="0.6">60%</option>
<option value="0.5">50%</option>
<option value="0.4">40%</option>
<option value="0.3">30%</option>
<option value="0.2">20%</option>
<option value="0.1">10%</option>
</select>
<input type="submit" name="Submit" value="调整图像大小">
</form>
<?php
}
}
closedir();
?>
第4步,创建index_ok.php文件,用来处理用户提交的调整图像大小的请求。在处理用户请求时,导入thumbnail.php文件,实例化image类,调用其中的thumb()方法,以表单中提交的数据作为参数,完成对图片大小的调整。
<?php
if($_POST['Submit']=="调整图像大小"){
include("thumbnail.php"); //包含图像类存储文件
$img = new image(); //实例化图像处理类
$return=$img->param($_POST['pic_path'])->thumb("./thumbnail/".$_POST['pic_name'], $_POST['pic_width'],$_POST['pic_height'],1);
echo "<script>alert('图像大小设置成功!'); window.location.href='index.php';</script>";
}
?>
第5步,创建thumbnail.php文件,新建image类,实现图片大小调整功能。
<?php
class image {
// 当前图片
protected $img;
// 图像types 对应表
protected $types = array (1 => 'gif', 2 => 'jpg', 3 => 'png', 6 => 'bmp' );
// image
public function __construct($img = '') {
! $img && $this->param ( $img );
}
// Info
public function param($img) {
$this->img = $img;
return $this;
}
// 获取当前图片的信息,类型、大小
public function getImageInfo($img) {
$info = @getimagesize ( $img );
if (isset ( $this->types [$info [2]] )) {
$info ['ext'] = $info ['type'] = $this->types [$info [2]];
} else {
$info ['ext'] = $info ['type'] = 'jpg';
}
$info ['type'] == 'jpg' && $info ['type'] = 'jpeg';
$info ['size'] = @filesize ( $img );
return $info;
}
// thumb(新图地址, 宽, 高, 裁剪, 允许放大)
public function thumb($filename, $news_w = 100, $news_h = 100, $cut = 0, $big = 0) {
// 获取原图信息
$info = $this->getImageInfo ( $this->img );
if (! empty ( $info [0] )) {
$old_w = $info [0];
$old_h = $info [1];
$new_w = $old_w * $news_w;
$new_h = $old_h * $news_h;
$type = $info ['type'];
$ext = $info ['ext'];
unset ( $info );
// 如果原图比缩略图小 并且不允许放大
if ($old_w < $new_h && $old_h < $new_w && ! $big) {
return false;
}
// 裁剪图片
if ($cut == 1) { // center center 裁剪
$scale1 = round ( $new_w / $new_h, 2 );
$scale2 = round ( $old_w / $old_h, 2 );
if ($scale1 > $scale2) {
$end_h = round ( $old_w / $scale1, 2 );
$start_h = ($old_h - $end_h) / 2;
$start_w = 0;
$end_w = $old_w;
} else {
$end_w = round ( $old_h * $scale1, 2 );
$start_w = ($old_w - $end_w) / 2;
$start_h = 0;
$end_h = $old_h;
}
$width = $new_w;
$height = $new_h;
}
// 载入原图
$createFun = 'ImageCreateFrom' . $type;
$oldimg = $createFun ( $this->img );
// 创建缩略图
if ($type != 'gif' && function_exists ( 'imagecreatetruecolor' )) {
$newimg = imagecreatetruecolor ( $width, $height );
} else {
$newimg = imagecreate ( $width, $height );
}
// 复制图片
if (function_exists ( "ImageCopyResampled" )) {
ImageCopyResampled ( $newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w, $end_h );
} else {
ImageCopyResized ( $newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w, $end_h );
}
// 对jpeg图形设置隔行扫描
$type == 'jpeg' && imageinterlace ( $newimg, 1 );
// 生成图片
$imageFun = 'image' . $type;
! @$imageFun ( $newimg, $filename ) && die ( '保存失败!' );
ImageDestroy ( $newimg ); //销毁图像
return $filename; //返回图像名称
}
}
}
?>
在本例中编写的只是一个可以按比例任意调整图像大小的方法,如果读者感兴趣,可以对这个方法进行扩展。例如,向图像中添加水印、以数值的形式调整图像大小、向图像中添加文字以及给图像生成缩略图等。如果将这些功能综合到一起,那么它就变成了一个简单、实用的图像处理工具了,本实例虽然没有将这些功能进行整合,但是这里提到的每种方法在实例中都有体现,读者可以尝试将它们整合到一起。