本节示例通过编写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; //返回图像名称 } } } ?>
在本例中编写的只是一个可以按比例任意调整图像大小的方法,如果读者感兴趣,可以对这个方法进行扩展。例如,向图像中添加水印、以数值的形式调整图像大小、向图像中添加文字以及给图像生成缩略图等。如果将这些功能综合到一起,那么它就变成了一个简单、实用的图像处理工具了,本实例虽然没有将这些功能进行整合,但是这里提到的每种方法在实例中都有体现,读者可以尝试将它们整合到一起。