调整图片大小

课后整理 2021-1-7

本节示例通过编写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;            //返回图像名称
        }
    }
}
?>

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