网站首页  汉语字词  英语词汇  考试资料  写作素材  旧版资料

请输入您要查询的考试资料:

 

标题 php将图片保存为不同尺寸图片的图片类实例
内容
    这篇文章主要介绍了php将图片保存为不同尺寸图片的图片类,涉及php图片操作的保存、复制、缩略图等常用技巧,并封装成一个类文件以便于调用,非常具有实用价值,需要的朋友可以参考下
    本文实例讲述了php将图片保存为不同规格的图片类。分享给大家供大家参考。具体如下:
    图片处理类.imagecls.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;
    }
    }
    }
    ?>
    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 = $img_name."_".$width."x".$height.".jpg";
    else
    $new_path = $img_name."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;
    }
    3.使用方法:
    //im:将店铺图片保存为3种规格:小图:48x48,中图120x120,大图200x200
    $small_url=get_spec_image($data['image'],48,48,0);
    $<span id="result_box" 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);
    希望本文所述对大家的php程序设计有所帮助。
随便看

 

在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。

 

Copyright © 2002-2024 cuapp.net All Rights Reserved
更新时间:2025/5/13 3:03:34