PHP-图片压缩

方式一:

<?php

/*

----------------------------------------------------------------------

函数:调整图片尺寸或生成缩略图

修改:2009-8-8

返回:True/False

参数:

   $Image   需要调整的图片(含路径)

   $Dw=450   调整时最大宽度;缩略图时的绝对宽度

   $Dh=450   调整时最大高度;缩略图时的绝对高度

   $Type=1   1,调整尺寸; 2,生成缩略图

作者:Seven(QQ:9256114)WWW.7DI.NET*/

$path='img/';//路径

$phtypes=array(

   'img/gif',

   'img/jpg',

   'img/jpeg',

   'img/bmp',

   'img/pjpeg',

   'img/x-png'

);

Function Img($Image,$Dw=450,$Dh=450,$Type=1){

   IF(!File_Exists($Image)){

    Return False;

   }

   #如果需要生成缩略图,则将原图拷贝一下重新给$Image赋值

   IF($Type!=1){

    Copy($Image,Str_Replace(".","_x.",$Image));

    $Image=Str_Replace(".","_x.",$Image);

   }

   #取得文件的类型,根据不同的类型建立不同的对象

   $ImgInfo=GetImageSize($Image);

   Switch($ImgInfo[2]){

   Case 1:

    $Img = @ImageCreateFromGIF($Image);

   Break;

   Case 2:

    $Img = @ImageCreateFromJPEG($Image);

   Break;

   Case 3:

    $Img = @ImageCreateFromPNG($Image);

   Break;

   }

   #如果对象没有创建成功,则说明非图片文件

   IF(Empty($Img)){

    #如果是生成缩略图的时候出错,则需要删掉已经复制的文件

    IF($Type!=1){Unlink($Image);}

    Return False;

   }

   #如果是执行调整尺寸操作则

   IF($Type==1){

    $w=ImagesX($Img);

    $h=ImagesY($Img);

    $width = $w;

    $height = $h;

    IF($width>$Dw){

     $Par=$Dw/$width;

     $width=$Dw;

     $height=$height*$Par;

     IF($height>$Dh){

      $Par=$Dh/$height;

      $height=$Dh;

      $width=$width*$Par;

     }

    }ElseIF($height>$Dh){

     $Par=$Dh/$height;

     $height=$Dh;

     $width=$width*$Par;

     IF($width>$Dw){

      $Par=$Dw/$width;

      $width=$Dw;

      $height=$height*$Par;

     }

    }Else{

     $width=$width;

     $height=$height;

    }

    $nImg = ImageCreateTrueColor($width,$height);     #新建一个真彩色画布

    ImageCopyReSampled($nImg,$Img,0,0,0,0,$width,$height,$w,$h);#重采样拷贝部分图像并调整大小

    ImageJpeg ($nImg,$Image);          #以JPEG格式将图像输出到浏览器或文件

    Return True;

   #如果是执行生成缩略图操作则

   }Else{

    $w=ImagesX($Img);

    $h=ImagesY($Img);

    $width = $w;

    $height = $h;

    $nImg = ImageCreateTrueColor($Dw,$Dh);

    IF($h/$w>$Dh/$Dw){ #高比较大

     $width=$Dw;

     $height=$h*$Dw/$w;

     $IntNH=$height-$Dh;

     ImageCopyReSampled($nImg, $Img, 0, -$IntNH/1.8, 0, 0, $Dw, $height, $w, $h);

    }Else{     #宽比较大

     $height=$Dh;

     $width=$w*$Dh/$h;

     $IntNW=$width-$Dw;

     ImageCopyReSampled($nImg, $Img, -$IntNW/1.8, 0, 0, 0, $width, $Dh, $w, $h);

    }

    ImageJpeg ($nImg,$Image);

    Return True;

   }

}

?>

<html><body>

<form  method="post" enctype="multipart/form-data" name="form1">

  <table>

    <tr><td>上传图片</td></tr>

    <tr><td><input type="file" name="photo" size="20" /></td></tr>

  <tr><td><input type="submit" value="上传"/></td></tr>

  </table>

  允许上传的文件类型为:<?=implode(', ',$phtypes)?></form>

<?php

 if($_SERVER['REQUEST_METHOD']=='POST'){

    if (!is_uploaded_file($_FILES["photo"][tmp_name])){

      echo "图片不存在";

      exit();

    }

    if(!is_dir('img')){//路径若不存在则创建

     mkdir('img');

    }

    $upfile=$_FILES["photo"]; 

    $pinfo=pathinfo($upfile["name"]);

    $name=$pinfo['basename'];//文件名

    $tmp_name=$upfile["tmp_name"];

    $file_type=$pinfo['extension'];//获得文件类型

    $showphpath=$path.$name;

   

    if(in_array($upfile["type"],$phtypes)){

      echo "文件类型不符!";

      exit();

     }

   if(move_uploaded_file($tmp_name,$path.$name)){

    echo "成功!";

 Img($showphpath,100,800,2);

   }

   echo "<img src=\"".$showphpath."\"  />";

 }

?>

</body>

</html>

方式二:

PHP图片压缩的类

<?php

class ThumbHandler

{

var $dst_img;// 目标文件

var $h_src; // 图片资源句柄

var $h_dst;// 新图句柄

var $h_mask;// 水印句柄

var $img_create_quality = 100;// 图片生成质量

var $img_display_quality = 80;// 图片显示质量,默认为75

var $img_scale = 0;// 图片缩放比例

var $src_w = 0;// 原图宽度

var $src_h = 0;// 原图高度

var $dst_w = 0;// 新图总宽度

var $dst_h = 0;// 新图总高度

var $fill_w;// 填充图形宽

var $fill_h;// 填充图形高

var $copy_w;// 拷贝图形宽

var $copy_h;// 拷贝图形高

var $src_x = 0;// 原图绘制起始横坐标

var $src_y = 0;// 原图绘制起始纵坐标

var $start_x;// 新图绘制起始横坐标

var $start_y;// 新图绘制起始纵坐标

var $mask_word;// 水印文字

var $mask_img;// 水印图片

var $mask_pos_x = 0;// 水印横坐标

var $mask_pos_y = 0;// 水印纵坐标

var $mask_offset_x = 5;// 水印横向偏移

var $mask_offset_y = 5;// 水印纵向偏移

var $font_w;// 水印字体宽

var $font_h;// 水印字体高

var $mask_w;// 水印宽

var $mask_h;// 水印高

var $mask_font_color = "#ffffff";// 水印文字颜色

var $mask_font = 2;// 水印字体

var $font_size;// 尺寸

var $mask_position = 0;// 水印位置

var $mask_img_pct = 50;// 图片合并程度,值越大,合并程序越低

var $mask_txt_pct = 50;// 文字合并程度,值越小,合并程序越低

var $img_border_size = 0;// 图片边框尺寸

var $img_border_color;// 图片边框颜色

var $_flip_x=0;// 水平翻转次数

var $_flip_y=0;// 垂直翻转次数

var $cut_type=0;// 剪切类型

var $img_type;// 文件类型

// 文件类型定义,并指出了输出图片的函数

var $all_type = array(

       "jpg"   => array("output"=>"imagejpeg"),

       "gif"   => array("output"=>"imagegif"),

       "png"   => array("output"=>"imagepng"),

       "wbmp" => array("output"=>"image2wbmp"),

       "jpeg" => array("output"=>"imagejpeg"));

/**

    * 构造函数

    */

function ThumbHandler()

{

       $this->mask_font_color = "#ffffff";

       $this->font = 2;

       $this->font_size = 12;

}

/**

    * 取得图片的宽

    */

function getImgWidth($src)

{

       return imagesx($src);

}

/**

    * 取得图片的高

    */

function getImgHeight($src)

{

       return imagesy($src);

}

/**

    * 设置图片生成路径

    *

    * @param string $src_img 图片生成路径

    */

function setSrcImg($src_img, $img_type=null)

{

       if(!file_exists($src_img))

       {

         die("图片不存在");

       }

      

       if(!empty($img_type))

       {

         $this->img_type = $img_type;

       }

       else

       {

         $this->img_type = $this->_getImgType($src_img);

       }

      

       $this->_checkValid($this->img_type);

       // file_get_contents函数要求php版本>4.3.0

       $src = '';

       if(function_exists("file_get_contents"))

       {

         $src = file_get_contents($src_img);

       }

       else

       {

         $handle = fopen ($src_img, "r");

         while (!feof ($handle))

         {

            $src .= fgets($fd, 4096);

                          

         }

         fclose ($handle);

       }

       if(empty($src))

       {

         die("图片源为空");

       }

       $this->h_src = @ImageCreateFromString($src);

       $this->src_w = $this->getImgWidth($this->h_src);

       $this->src_h = $this->getImgHeight($this->h_src);

}

/**

    * 设置图片生成路径

    *

    * @param string $dst_img 图片生成路径

    */

function setDstImg($dst_img)

{

       $arr   = explode('/',$dst_img);

       $last = array_pop($arr);

       $path = implode('/',$arr);

       $this->_mkdirs($path);

       $this->dst_img = $dst_img;

}

/**

    * 设置图片的显示质量

    *

    * @param string    $n 质量

    */

function setImgDisplayQuality($n)

{

       $this->img_display_quality = (int)$n;

}

/**

    * 设置图片的生成质量

    *

    * @param string    $n 质量

    */

function setImgCreateQuality($n)

{

       $this->img_create_quality = (int)$n;

}

/**

    * 设置文字水印

    *

    * @param string     $word 水印文字

    * @param integer $font 水印字体

    * @param string     $color 水印字体颜色

    */

function setMaskWord($word)

{

       $this->mask_word .= $word;

}

/**

    * 设置字体颜色

    *

    * @param string     $color 字体颜色

    */

function setMaskFontColor($color="#ffffff")

{

       $this->mask_font_color = $color;

}

/**

    * 设置水印字体

    *

    * @param string|integer $font 字体

    */

function setMaskFont($font=2)

{

       if(!is_numeric($font) && !file_exists($font))

       {

         die("字体文件不存在");

       }

       $this->font = $font;

}

/**

    * 设置文字字体大小,仅对truetype字体有效

    */

function setMaskFontSize($size = "12")

{

       $this->font_size = $size;

}

/**

    * 设置图片水印

    *

    * @param string $img     水印图片源

    */

function setMaskImg($img)

{

       $this->mask_img = $img;

}

/**

    * 设置水印横向偏移

    *

    * @param integer     $x 横向偏移量

    */

function setMaskOffsetX($x)

{

       $this->mask_offset_x = (int)$x;

}

/**

    * 设置水印纵向偏移

    *

    * @param integer     $y 纵向偏移量

    */

function setMaskOffsetY($y)

{

       $this->mask_offset_y = (int)$y;

}

/**

    * 指定水印位置

    *

    * @param integer     $position 位置,1:左上,2:左下,3:右上,0/4:右下

    */

function setMaskPosition($position=0)

{

       $this->mask_position = (int)$position;

}

/**

    * 设置图片合并程度

    *

    * @param integer     $n 合并程度

    */

function setMaskImgPct($n)

{

       $this->mask_img_pct = (int)$n;

}

/**

    * 设置文字合并程度

    *

    * @param integer     $n 合并程度

    */

function setMaskTxtPct($n)

{

       $this->mask_txt_pct = (int)$n;

}

/**

    * 设置缩略图边框

    *

    * @param (类型)     (参数名) (描述)

    */

function setDstImgBorder($size=1, $color="#000000")

{

       $this->img_border_size   = (int)$size;

       $this->img_border_color = $color;

}

/**

    * 水平翻转

    */

function flipH()

{

       $this->_flip_x++;

}

/**

    * 垂直翻转

    */

function flipV()

{

       $this->_flip_y++;

}

/**

    * 设置剪切类型

    *

    * @param (类型)     (参数名) (描述)

    */

function setCutType($type)

{

       $this->cut_type = (int)$type;

}

/**

    * 设置图片剪切

    *

    * @param integer     $width 矩形剪切

    */

function setRectangleCut($width, $height)

{

       $this->fill_w = (int)$width;

       $this->fill_h = (int)$height;

}

/**

    * 设置源图剪切起始坐标点

    *

    * @param (类型)     (参数名) (描述)

    */

function setSrcCutPosition($x, $y)

{

       $this->src_x   = (int)$x;

       $this->src_y   = (int)$y;

}

/**

    * 创建图片,主函数

    * @param integer $a     当缺少第二个参数时,此参数将用作百分比,

    *                             否则作为宽度值

    * @param integer $b     图片缩放后的高度

    */

function createImg($a, $b=null)

{

       $num = func_num_args();

       if(1 == $num)

       {

         $r = (int)$a;

         if($r < 1)

         {

            die("图片缩放比例不得小于1");

         }

         $this->img_scale = $r;

         $this->_setNewImgSize($r);

       }

       if(2 == $num)

       {

         $w = (int)$a;

         $h = (int)$b;

         if(0 == $w)

         {

            die("目标宽度不能为0");

         }

         if(0 == $h)

         {

            die("目标高度不能为0");

         }

         $this->_setNewImgSize($w, $h);

       }

       if($this->_flip_x%2!=0)

       {

         $this->_flipH($this->h_src);

       }

       if($this->_flip_y%2!=0)

       {

         $this->_flipV($this->h_src);

       }

       $this->_createMask();

       $this->_output();

       // 释放

       if(imagedestroy($this->h_src) && imagedestroy($this->h_dst))

       {

         Return true;

       }

       else

       {

         Return false;

       }

}

/**

    * 生成水印,调用了生成水印文字和水印图片两个方法

    */

function _createMask()

{

       if($this->mask_word)

       {

         // 获取字体信息

         $this->_setFontInfo();

         if($this->_isFull())

         {

            die("水印文字过大");

         }

         else

         {

            $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);

            $white = ImageColorAllocate($this->h_dst,255,255,255);

            imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色

            $this->_drawBorder();

            imagecopyresampled( $this->h_dst, $this->h_src,

                                 $this->start_x, $this->start_y,

                                 $this->src_x, $this->src_y,

                                 $this->fill_w, $this->fill_h,

                                 $this->copy_w, $this->copy_h);

            $this->_createMaskWord($this->h_dst);

         }

       }

       if($this->mask_img)

       {

         $this->_loadMaskImg();//加载时,取得宽高

         if($this->_isFull())

         {

            // 将水印生成在原图上再拷

            $this->_createMaskImg($this->h_src);

            $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);

            $white = ImageColorAllocate($this->h_dst,255,255,255);

            imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色

            $this->_drawBorder();

            imagecopyresampled( $this->h_dst, $this->h_src,

                                 $this->start_x, $this->start_y,

                                 $this->src_x, $this->src_y,

                                 $this->fill_w, $this->start_y,

                                 $this->copy_w, $this->copy_h);

         }

         else

         {

            // 创建新图并拷贝

            $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);

            $white = ImageColorAllocate($this->h_dst,255,255,255);

            imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色

            $this->_drawBorder();

            imagecopyresampled( $this->h_dst, $this->h_src,

                                 $this->start_x, $this->start_y,

                                 $this->src_x, $this->src_y,

                                 $this->fill_w, $this->fill_h,

                                 $this->copy_w, $this->copy_h);

            $this->_createMaskImg($this->h_dst);

         }

       }

       if(empty($this->mask_word) && empty($this->mask_img))

       {

         $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);

         $white = ImageColorAllocate($this->h_dst,255,255,255);

         imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色

         $this->_drawBorder();

         imagecopyresampled( $this->h_dst, $this->h_src,

                     $this->start_x, $this->start_y,

                     $this->src_x, $this->src_y,

                     $this->fill_w, $this->fill_h,

                     $this->copy_w, $this->copy_h);

       }

}

/**

    * 画边框

    */

function _drawBorder()

{

       if(!empty($this->img_border_size))

       {

         $c = $this->_parseColor($this->img_border_color);

         $color = ImageColorAllocate($this->h_src,$c[0], $c[1], $c[2]);

         imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$color);// 填充背景色

       }

}

  

你可能感兴趣的:(PHP)