一個php圖片類,將圖片保存為不同尺寸的圖片

6e72 9年前發布 | 3K 次閱讀 PHP

圖片處理類.imagecls.php

<?php
/
    圖片處理類
 */
class imagecls
{
    /

 * 文件信息
 */
var $file = array();
/**
 * 保存目錄
 */
var $dir = '';
/**
 * 錯誤代碼
 */
var $error_code = 0;
/**
 * 文件上傳最大KB
 */
var $max_size = -1;

function es_imagecls()
{

}

private function checkSize($size)
{
    return !($size > $this->max_size) || (-1 == $this->max_size);
}

/**
 * 處理上傳文件
 * @param array $file 上傳的文件
 * @param string $dir 保存的目錄
 * @return bool
 */
function init($file, $dir = 'temp')
{
    if(!is_array($file) || empty($file) || !$this->isUploadFile($file['tmp_name']) || trim($file['name']) == '' || $file['size'] == 0)
    {
        $this->file = array();
        $this->error_code = -1;
        return false;
    }
    else
    {
        $file['size'] = intval($file['size']);
        $file['name'] =  trim($file['name']);
        $file['thumb'] = '';
        $file['ext'] = $this->fileExt($file['name']);
        $file['name'] =  htmlspecialchars($file['name'], ENT_QUOTES);
        $file['is_image'] = $this->isImageExt($file['ext']);
        $file['file_dir'] = $this->getTargetDir($dir);
        $file['prefix'] = md5(microtime(true)).rand(10,99);
        $file['target'] = "./public/".$file['file_dir'].'/'.$file['prefix'].'.jpg';  //相對
        $file['local_target'] = APP_ROOT_PATH."public/".$file['file_dir'].'/'.$file['prefix'].'.jpg';  //物理
        $this->file = &$file;

        $this->error_code = 0;
        return true;
    }

}

/**
 * 保存文件
 * @return bool
 */
function save()
{
    if(empty($this->file) || empty($this->file['tmp_name']))
        $this->error_code = -101;
    elseif(!$this->checkSize($this->file['size']))
        $this->error_code = -105;
    elseif(!$this->file['is_image'])
        $this->error_code = -102;
    elseif(!$this->saveFile($this->file['tmp_name'], $this->file['local_target']))
        $this->error_code = -103;
    elseif($this->file['is_image'] && (!$this->file['image_info'] = $this->getImageInfo($this->file['local_target'], true)))
    {
        $this->error_code = -104;
        @unlink($this->file['local_target']);
    }
    else
    {
        $this->error_code = 0;
        return true;
    }
    return false;
}

/**
 * 獲取錯誤代碼
 * @return number
 */
function error()
{
    return $this->error_code;
}

/**
 * 獲取文件擴展名
 * @return string
 */
function fileExt($file_name)
{
    return addslashes(strtolower(substr(strrchr($file_name, '.'), 1, 10)));
}

/**
 * 根據擴展名判斷文件是否為圖像
 * @param string $ext 擴展名
 * @return bool
 */
function isImageExt($ext)
{
    static $img_ext  = array('jpg', 'jpeg', 'png', 'bmp','gif','giff');
    return in_array($ext, $img_ext) ? 1 : 0;
}

/**
 * 獲取圖像信息
 * @param string $target 文件路徑
 * @return mixed
 */
function getImageInfo($target)
{
    $ext = es_imagecls::fileExt($target);
    $is_image = es_imagecls::isImageExt($ext);

    if(!$is_image)
        return false;
    elseif(!is_readable($target))
        return false;
    elseif($image_info = @getimagesize($target))
    {
        list($width, $height, $type) = !empty($image_info) ? $image_info : array('', '', '');
        $size = $width * $height;
        if($is_image && !in_array($type, array(1,2,3,6,13)))
            return false;

        $image_info['type'] = strtolower(substr(image_type_to_extension($image_info[2]),1));
        return $image_info;
    }
    else
        return false;
}

/**
 * 獲取是否充許上傳文件
 * @param string $source 文件路徑
 * @return bool
 */
function isUploadFile($source)
{
    return $source && ($source != 'none') && (is_uploaded_file($source) || is_uploaded_file(str_replace('\\\\', '\\', $source)));
}

/**
 * 獲取保存的路徑
 * @param string $dir 指定的保存目錄
 * @return string
 */
function getTargetDir($dir)
{         
    if (!is_dir(APP_ROOT_PATH."public/".$dir)) { 
         @mkdir(APP_ROOT_PATH."public/".$dir);
         @chmod(APP_ROOT_PATH."public/".$dir, 0777);
    }
    return $dir;
}

/**
 * 保存文件
 * @param string $source 源文件路徑
 * @param string $target 目錄文件路徑
 * @return bool
 */
private function saveFile($source, $target)
{
    if(!es_imagecls::isUploadFile($source))
        $succeed = false;
    elseif(@copy($source, $target))
        $succeed = true;
    elseif(function_exists('move_uploaded_file') && @move_uploaded_file($source, $target))
        $succeed = true;
    elseif (@is_readable($source) && (@$fp_s = fopen($source, 'rb')) && (@$fp_t = fopen($target, 'wb')))
    {
        while (!feof($fp_s))
        {
            $s = @fread($fp_s, 1024 * 512);
            @fwrite($fp_t, $s);
        }
        fclose($fp_s);
        fclose($fp_t);
        $succeed = true;
    }

    if($succeed)
    {
        $this->error_code = 0;
        @chmod($target, 0644);
        @unlink($source);
    }
    else
    {
        $this->error_code = 0;
    }

    return $succeed;
}

public function thumb($image,$maxWidth=200,$maxHeight=50,$gen = 0,$interlace=true,$filepath = '',$is_preview = true)
{
    $info  = es_imagecls::getImageInfo($image);

    if($info !== false)
    {
        $srcWidth  = $info[0];
        $srcHeight = $info[1];
        $type = $info['type'];

        $interlace  =  $interlace? 1:0;
        unset($info);

        if($maxWidth > 0 && $maxHeight > 0)
            $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 計算縮放比例
        elseif($maxWidth == 0)
            $scale = $maxHeight/$srcHeight;
        elseif($maxHeight == 0)
            $scale = $maxWidth/$srcWidth;

        $paths = pathinfo($image);
        $paths['filename'] = trim(strtolower($paths['basename']),".".strtolower($paths['extension']));
        $basefilename = explode("_",$paths['filename']);
        $basefilename = $basefilename[0];
        if(empty($filepath))
        {
            if($is_preview)
            $thumbname = $paths['dirname'].'/'.$basefilename.'_'.$maxWidth.'x'.$maxHeight.'.jpg';
            else
            $thumbname = $paths['dirname'].'/'.$basefilename.'o_'.$maxWidth.'x'.$maxHeight.'.jpg';
        }
        else
            $thumbname = $filepath;

        $thumburl = str_replace(APP_ROOT_PATH,'./',$thumbname);

        if($scale >= 1)
        {
            // 超過原圖大小不再縮略
            $width   =  $srcWidth;
            $height  =  $srcHeight;         
            if(!$is_preview)
            {       
                //非預覽模式寫入原圖
                file_put_contents($thumbname,file_get_contents($image));    //用原圖寫入            
                return array('url'=>$thumburl,'path'=>$thumbname);
            }
        }
        else
        {
            // 縮略圖尺寸
            $width  = (int)($srcWidth*$scale);
            $height = (int)($srcHeight*$scale);
        }       

        if($gen == 1)
        {
            $width = $maxWidth;
            $height = $maxHeight;
        }

        // 載入原圖
        $createFun = 'imagecreatefrom'.($type=='jpg'?'jpeg':$type);
        if(!function_exists($createFun))
            $createFun = 'imagecreatefromjpeg';

        $srcImg = $createFun($image);

        //創建縮略圖
        if($type!='gif' && function_exists('imagecreatetruecolor'))
            $thumbImg = imagecreatetruecolor($width, $height);
        else
            $thumbImg = imagecreate($width, $height);

        $x = 0;
        $y = 0;

        if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)
        {
            $resize_ratio = $maxWidth/$maxHeight;
            $src_ratio = $srcWidth/$srcHeight;
            if($src_ratio >= $resize_ratio)
            {
                $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;
                $width = ($height * $srcWidth) / $srcHeight;
            }
            else
            {
                $y = ($srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;
                $height = ($width * $srcHeight) / $srcWidth;
            }
        }

        // 復制圖片
        if(function_exists("imagecopyresampled"))
            imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height, $srcWidth,$srcHeight);
        else
            imagecopyresized($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,  $srcWidth,$srcHeight);
        if('gif'==$type || 'png'==$type) {
            $background_color  =  imagecolorallocate($thumbImg,  0,255,0);  //  指派一個綠色
            imagecolortransparent($thumbImg,$background_color);  //  設置為透明色,若注釋掉該行則輸出綠色的圖
        }

        // 對jpeg圖形設置隔行掃描
        if('jpg'==$type || 'jpeg'==$type)
            imageinterlace($thumbImg,$interlace);

        // 生成圖片
        imagejpeg($thumbImg,$thumbname,100);
        imagedestroy($thumbImg);
        imagedestroy($srcImg);

        return array('url'=>$thumburl,'path'=>$thumbname);
     }
     return false;
}

public function make_thumb($srcImg,$srcWidth,$srcHeight,$type,$maxWidth=200,$maxHeight=50,$gen = 0)
{

        $interlace  =  $interlace? 1:0;

        if($maxWidth > 0 && $maxHeight > 0)
            $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 計算縮放比例
        elseif($maxWidth == 0)
            $scale = $maxHeight/$srcHeight;
        elseif($maxHeight == 0)
            $scale = $maxWidth/$srcWidth;

        if($scale >= 1)
        {
            // 超過原圖大小不再縮略
            $width   =  $srcWidth;
            $height  =  $srcHeight;
        }
        else
        {
            // 縮略圖尺寸
            $width  = (int)($srcWidth*$scale);
            $height = (int)($srcHeight*$scale);
        }

        if($gen == 1)
        {
            $width = $maxWidth;
            $height = $maxHeight;
        }

        //創建縮略圖
        if($type!='gif' && function_exists('imagecreatetruecolor'))
            $thumbImg = imagecreatetruecolor($width, $height);
        else
            $thumbImg = imagecreatetruecolor($width, $height);

        $x = 0;
        $y = 0;

        if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)
        {
            $resize_ratio = $maxWidth/$maxHeight;
            $src_ratio = $srcWidth/$srcHeight;
            if($src_ratio >= $resize_ratio)
            {
                $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;
                $width = ($height * $srcWidth) / $srcHeight;
            }
            else
            {
                $y = ($srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;
                $height = ($width * $srcHeight) / $srcWidth;
            }
        }

        // 復制圖片
        if(function_exists("imagecopyresampled"))
            imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height, $srcWidth,$srcHeight);
        else
            imagecopyresized($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,  $srcWidth,$srcHeight);
        if('gif'==$type || 'png'==$type) {
            $background_color  =  imagecolorallocate($thumbImg,  255,255,255);  //  指派一個綠色
            imagecolortransparent($thumbImg,$background_color);  //  設置為透明色,若注釋掉該行則輸出綠色的圖
        }

        // 對jpeg圖形設置隔行掃描
        if('jpg'==$type || 'jpeg'==$type)
            imageinterlace($thumbImg,$interlace);

       return $thumbImg;

}

public function water($source,$water,$alpha=80,$position="0")
{
    //檢查文件是否存在
    if(!file_exists($source)||!file_exists($water))
        return false;

    //圖片信息
    $sInfo = es_imagecls::getImageInfo($source);
    $wInfo = es_imagecls::getImageInfo($water);

    //如果圖片小于水印圖片,不生成圖片
    if($sInfo["0"] < $wInfo["0"] || $sInfo['1'] < $wInfo['1'])
        return false;

    if(is_animated_gif($source))
    {
        require_once APP_ROOT_PATH."system/utils/gif_encoder.php";
        require_once APP_ROOT_PATH."system/utils/gif_reader.php";

        $gif = new GIFReader();
        $gif->load($source);
        foreach($gif->IMGS['frames'] as $k=>$img)
        {
            $im = imagecreatefromstring($gif->getgif($k));      
            //為im加水印
            $sImage=$im;        
            $wCreateFun="imagecreatefrom".$wInfo['type'];
            if(!function_exists($wCreateFun))
                $wCreateFun = 'imagecreatefromjpeg';
            $wImage=$wCreateFun($water);

            //設定圖像的混色模式
            imagealphablending($wImage, true);      
            switch (intval($position))
            {
                case 0: break;
                //左上
                case 1:
                    $posY=0;
                    $posX=0;
                    //生成混合圖像
                    imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
                    break;
                //右上
                case 2:
                    $posY=0;
                    $posX=$sInfo[0]-$wInfo[0];
                    //生成混合圖像
                    imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
                    break;
                //左下
                case 3:
                    $posY=$sInfo[1]-$wInfo[1];
                    $posX=0;
                    //生成混合圖像
                    imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
                    break;
                //右下
                case 4:
                    $posY=$sInfo[1]-$wInfo[1];
                    $posX=$sInfo[0]-$wInfo[0];
                    //生成混合圖像
                    imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
                    break;
                //居中
                case 5:
                    $posY=$sInfo[1]/2-$wInfo[1]/2;
                    $posX=$sInfo[0]/2-$wInfo[0]/2;
                    //生成混合圖像
                    imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
                    break;
            }
            //end im加水印

            ob_start();
            imagegif($sImage);
            $content = ob_get_contents();
            ob_end_clean();
            $frames [ ] = $content;
            $framed [ ] = $img['frameDelay'];
        }

        $gif_maker = new GIFEncoder (
               $frames,
               $framed,
               0,
               2,
               0, 0, 0,
               "bin"   //bin為二進制   url為地址
          );
        $image_rs = $gif_maker->GetAnimation ( );

        //如果沒有給出保存文件名,默認為原圖像名
        @unlink($source);
        //保存圖像
        file_put_contents($source,$image_rs);
        return true;
    }   

    //建立圖像
    $sCreateFun="imagecreatefrom".$sInfo['type'];
    if(!function_exists($sCreateFun))
        $sCreateFun = 'imagecreatefromjpeg';
    $sImage=$sCreateFun($source);

    $wCreateFun="imagecreatefrom".$wInfo['type'];
    if(!function_exists($wCreateFun))
        $wCreateFun = 'imagecreatefromjpeg';
    $wImage=$wCreateFun($water);

    //設定圖像的混色模式
    imagealphablending($wImage, true);

    switch (intval($position))
    {
        case 0: break;
        //左上
        case 1:
            $posY=0;
            $posX=0;
            //生成混合圖像
            imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
            break;
        //右上
        case 2:
            $posY=0;
            $posX=$sInfo[0]-$wInfo[0];
            //生成混合圖像
            imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
            break;
        //左下
        case 3:
            $posY=$sInfo[1]-$wInfo[1];
            $posX=0;
            //生成混合圖像
            imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
            break;
        //右下
        case 4:
            $posY=$sInfo[1]-$wInfo[1];
            $posX=$sInfo[0]-$wInfo[0];
            //生成混合圖像
            imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
            break;
        //居中
        case 5:
            $posY=$sInfo[1]/2-$wInfo[1]/2;
            $posX=$sInfo[0]/2-$wInfo[0]/2;
            //生成混合圖像
            imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
            break;
    }

    //如果沒有給出保存文件名,默認為原圖像名
    @unlink($source);
    //保存圖像
    imagejpeg($sImage,$source,100);
    imagedestroy($sImage);
}

}

if(!function_exists('image_type_to_extension')) { function image_type_to_extension($imagetype) { if(empty($imagetype)) return false;

    switch($imagetype)
    {
        case IMAGETYPE_GIF    : return '.gif';
        case IMAGETYPE_JPEG   : return '.jpeg';
        case IMAGETYPE_PNG    : return '.png';
        case IMAGETYPE_SWF    : return '.swf';
        case IMAGETYPE_PSD    : return '.psd';
        case IMAGETYPE_BMP    : return '.bmp';
        case IMAGETYPE_TIFF_II : return '.tiff';
        case IMAGETYPE_TIFF_MM : return '.tiff';
        case IMAGETYPE_JPC    : return '.jpc';
        case IMAGETYPE_JP2    : return '.jp2';
        case IMAGETYPE_JPX    : return '.jpf';
        case IMAGETYPE_JB2    : return '.jb2';
        case IMAGETYPE_SWC    : return '.swc';
        case IMAGETYPE_IFF    : return '.aiff';
        case IMAGETYPE_WBMP   : return '.wbmp';
        case IMAGETYPE_XBM    : return '.xbm';
        default               : return false;
    }
}

} ?></pre>
2.get_spec_img()調用圖片類,然后再用下面的方法保存不同規格的圖片并返回圖片連接

//獲取相應規格的圖片地址
//gen=0:保持比例縮放,不剪裁,如高為0,則保證寬度按比例縮放 gen=1:保證長寬,剪裁
function get_spec_image($img_path,$width=0,$height=0,$gen=0,$is_preview=true)
{
if($width==0)
$new_path = $img_path;
else
{
$img_name = substr($img_path,0,-4);
$img_ext = substr($img_path,-3);
if($is_preview)
$new_path = $imgname."".$width."x".$height.".jpg";
else
$new_path = $imgname."o".$width."x".$height.".jpg";
if(!file_exists($new_path))
{
require_once "imagecls.php";
$imagec = new imagecls();
$thumb = $imagec->thumb($img_path,$width,$height,$gen,true,"",$is_preview);

        if(app_conf("PUBLIC_DOMAIN_ROOT")!='')  
        {  
            $paths = pathinfo($new_path);  
            $path = str_replace("./","",$paths['dirname']);  
            $filename = $paths['basename'];  
            $pathwithoupublic = str_replace("public/","",$path);  

                    $file_data = @file_get_contents($path.$file);  
                    $img = @imagecreatefromstring($file_data);  
                    if($img!==false)  
                    {  
                       $save_path = "public/".$path;  
                       if(!is_dir($save_path))  
                       {  
                            @mk_dir($save_path);              
                       }  
                       @file_put_contents($save_path.$name,$file_data);  
                    }  
        }  

    }  
}  
return $new_path;  

}
</pre>
3.使用方法:

/im:將店鋪圖片保存為3種規格:小圖:48x48,中圖120x120,大圖200x200
            $small_url=get_spec_image($data['image'],48,48,0);
            $<span id="result_box" class="short_text" lang="en"><span>middle_url</span></span>=get_spec_image($data['image'],120,120,0);
            $big_url=get_spec_image($data['image'],200,200,0);

 本文由用戶 6e72 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!