zoukankan      html  css  js  c++  java
  • 图片压缩

    说明 
    在项目中,经常会遇到在前端页面展示用户自己上传的图片。当部分图片尺寸过大,页面图片过多的情况下(如论坛里需要显示用户头像),会引起页面加载缓慢的问题。由于用户图片已存储导数据库,无法改变库里的图片大小,只能在获取图片路径时,压缩图片

    示例 
    以下函数为图片压缩方法

    /**
     * 图片压缩处理
     * @param string $sFile 图片路径
     * @param int $iWidth 自定义图片宽度
     * @param int $iHeight 自定义图片高度
     */
    function getThumb($sFile,$iWidth,$iHeight){
        //判断该图片是否存在
        if(!file_exists(public_path().$sFile)) return $sFile;
        //判断图片格式
        $attach_fileext = get_filetype($sFile);
        if (!in_array($attach_fileext, array('jpg','png','jpeg'))){
            return $sFile;
        }
        //压缩图片
        $sFileNameS = str_replace(".".$attach_fileext, "_".$iWidth.'_'.$iHeight.'.'.$attach_fileext, $sFile);
        //判断是否已压缩图片,若是则返回压缩图片路径
        if(file_exists(public_path().$sFileNameS)){
            return $sFileNameS;
        }
        //解决手机端上传图片被旋转问题
        if (in_array($attach_fileext, array('jpeg')) ){
            adjustPicOrientation(public_path().$sFile);
        }
        //生成压缩图片,并存储到原图同路径下
        resizeImage(public_path().$sFile, public_path().$sFileNameS, $iWidth, $iHeight);
        if(!file_exists(public_path().$sFileNameS)){
            return $sFile;
        }
        return $sFileNameS;
    }
    
    /**
     *获取文件后缀名
     */
    function get_filetype($filename) {
        $extend = explode("." , $filename);
        return strtolower($extend[count($extend) - 1]);
    }
    
    /**
     * 解决手机上传图片被旋转问题
     * @param string $full_filename 文件路径
     */
    function adjustPicOrientation($full_filename){
        $exif = exif_read_data($full_filename);
        if($exif && isset($exif['Orientation'])) {
            $orientation = $exif['Orientation'];
            if($orientation != 1){
                $img = imagecreatefromjpeg($full_filename);
    
                $mirror = false;
                $deg    = 0;
    
                switch ($orientation) {
                    case 2:
                        $mirror = true;
                        break;
                    case 3:
                        $deg = 180;
                        break;
                    case 4:
                        $deg = 180;
                        $mirror = true;
                        break;
                    case 5:
                        $deg = 270;
                        $mirror = true;
                        break;
                    case 6:
                        $deg = 270;
                        break;
                    case 7:
                        $deg = 90;
                        $mirror = true;
                        break;
                    case 8:
                        $deg = 90;
                        break;
                }
                if ($deg) $img = imagerotate($img, $deg, 0);
                if ($mirror) $img = _mirrorImage($img);
                //$full_filename = str_replace('.jpg', "-O$orientation.jpg",  $full_filename);新文件名
                imagejpeg($img, $full_filename, 95);
            }
        }
        return $full_filename;
    }
    
    resizeImage(public_path().$sFile, public_path().$sFileNameS, $iWidth, $iHeight);
    
    /**
     * 生成图片
     * @param string $im 源图片路径
     * @param string $dest 目标图片路径
     * @param int $maxwidth 生成图片宽
     * @param int $maxheight 生成图片高
     */
    function resizeImage($im, $dest, $maxwidth, $maxheight) {
        $img = getimagesize($im);
        switch ($img[2]) {
            case 1:
                $im = @imagecreatefromgif($im);
                break;
            case 2:
                $im = @imagecreatefromjpeg($im);
                break;
            case 3:
                $im = @imagecreatefrompng($im);
                break;
        }
    
        $pic_width = imagesx($im);
        $pic_height = imagesy($im);
        $resizewidth_tag = false;
        $resizeheight_tag = false;
        if (($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight)) {
            if ($maxwidth && $pic_width > $maxwidth) {
                $widthratio = $maxwidth / $pic_width;
                $resizewidth_tag = true;
            }
    
            if ($maxheight && $pic_height > $maxheight) {
                $heightratio = $maxheight / $pic_height;
                $resizeheight_tag = true;
            }
    
            if ($resizewidth_tag && $resizeheight_tag) {
                if ($widthratio < $heightratio)
                    $ratio = $widthratio;
                else
                    $ratio = $heightratio;
            }
    
    
            if ($resizewidth_tag && !$resizeheight_tag)
                $ratio = $widthratio;
            if ($resizeheight_tag && !$resizewidth_tag)
                $ratio = $heightratio;
            $newwidth = $pic_width * $ratio;
            $newheight = $pic_height * $ratio;
    
            if (function_exists("imagecopyresampled")) {
                $newim = imagecreatetruecolor($newwidth, $newheight);
                imagecopyresampled($newim, $im, 0, 0, 0, 0, $newwidth, $newheight, $pic_width, $pic_height);
            } else {
                $newim = imagecreate($newwidth, $newheight);
                imagecopyresized($newim, $im, 0, 0, 0, 0, $newwidth, $newheight, $pic_width, $pic_height);
            }
    
            imagejpeg($newim, $dest);
            imagedestroy($newim);
        } else {
            imagejpeg($im, $dest);
        }
    }
    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kirsten_z/article/details/77256475
  • 相关阅读:
    PTA A1005&A1006
    PTA A1003&A1004
    PTA A1001&A1002
    MOOC web前端开发笔记(二)
    MOOC web前端开发笔记(一)
    MOOC C++笔记(三):类和对象提高
    MOOC C++笔记(二):类和对象基础
    MOOC C++笔记(一):从C到C++
    linux command tee
    modbus数据格式(一)
  • 原文地址:https://www.cnblogs.com/jierong12/p/9075975.html
Copyright © 2011-2022 走看看