<?php

/**
 * 分享请保持网址。尊重别人劳动成果。谢谢。
 * 图片压缩类:通过缩放来压缩。如果要保持源图比例,把参数$percent保持为1即可。
 * 即使原比例压缩,也可大幅度缩小。数码相机4M图片。也可以缩为700KB左右。如果缩小比例,则体积会更小。
 * 结果:可保存、可直接显示。
 */
class imgcompress
{

private $src;

private $image;

private $imageinfo;

private $percent = 0.5;

/**
     * 图片压缩
     *
     * @param $src 源图            
     * @param float $percent
     *            压缩比例
     */
    public function __construct($src, $percent = 1)
    {
        $this->src = $src;
        $this->percent = $percent;
    }

/**
     * 高清压缩图片
     *
     * @param string $saveName
     *            提供图片名(可不带扩展名,用源图扩展名)用于保存。或不提供文件名直接显示
     * @param int $maxFileSize
     *            目标文件大小
     */
    public function compressImg($saveName = '')
    {
        $this->_openImage();
        if (! empty($saveName))
            
            $this->_saveImage($saveName); // 保存
        else
            $this->_showImage();
        
        return true;
    }

/**
     * 内部:打开图片
     */
    private function _openImage()
    {
        list ($width, $height, $type, $attr) = getimagesize($this->src);
        $this->imageinfo = array(
            'width' => $width,
            'height' => $height,
            'type' => image_type_to_extension($type, false),
            'attr' => $attr
        );
        $fun = "imagecreatefrom" . $this->imageinfo['type'];
        $this->image = $fun($this->src);
        
        $this->_thumpImage();
    }

/**
     * 内部:操作图片
     */
    private function _thumpImage()
    {
        
        // $this->percent = $this->imageinfo['width'] ;
        $new_width = $this->imageinfo['width'] * $this->percent;
        $new_height = $this->imageinfo['height'] * $this->percent;
        
        // $new_width = 1200;
        // $new_height = 900;
        
        $image_thump = imagecreatetruecolor($new_width, $new_height);
        // 将原图复制带图片载体上面,并且按照一定比例压缩,极大的保持了清晰度
        imagecopyresampled($image_thump, $this->image, 0, 0, 0, 0, $new_width, $new_height, $this->imageinfo['width'], $this->imageinfo['height']);
        imagedestroy($this->image);
        $this->image = $image_thump;
        
//         $this->image = imagerotate($this->image, 270, 0);
    }

/**
     * 输出图片:保存图片则用saveImage()
     */
    private function _showImage()
    {
        header('Content-Type: image/' . $this->imageinfo['type']);
        $funcs = "image" . $this->imageinfo['type'];
        $funcs($this->image);
    }

/**
     * 保存图片到硬盘:
     *
     * @param string $dstImgName
     *            1、可指定字符串不带后缀的名称,使用源图扩展名 。2、直接指定目标图片名带扩展名。
     */
    private function _saveImage($dstImgName)
    {
        if (empty($dstImgName))
            return false;
        $allowImgs = [
            '.jpg',
            '.jpeg',
            '.png',
            '.bmp',
            '.wbmp',
            '.gif'
        ]; // 如果目标图片名有后缀就用目标图片扩展名 后缀,如果没有,则用源图的扩展名
        $dstExt = strrchr($dstImgName, ".");
        $sourseExt = strrchr($this->src, ".");
        if (! empty($dstExt))
            $dstExt = strtolower($dstExt);
        if (! empty($sourseExt))
            $sourseExt = strtolower($sourseExt);
        
        // 有指定目标名扩展名
        if (! empty($dstExt) && in_array($dstExt, $allowImgs)) {
            $dstName = $dstImgName;
        } elseif (! empty($sourseExt) && in_array($sourseExt, $allowImgs)) {
            $dstName = $dstImgName . $sourseExt;
        } else {
            $dstName = $dstImgName . $this->imageinfo['type'];
        }
        $funcs = "image" . $this->imageinfo['type'];
        $funcs($this->image, $dstName);
    }

/**
     * 销毁图片
     */
    public function __destruct()
    {
        if(!empty($this->image)){
            imagedestroy($this->image);
        }
    }

/**
     * 压缩图片到指定大小内
     * @param string $to_source

*          压缩后保存的路径
     * @param number $maxFileSize
     *            要压缩的大小
     * @return boolean
     */
    public function getimg($to_source, $maxFileSize = 200)
    {
        $source_size = filesize($this->src) / 1024;
        if ($source_size < $maxFileSize) {
            copy($this->src, $to_source);
            return true;
        } else {
            
            $ys = true;
            $i = 0;
            while ($ys) {
                clearstatcache();
                $this->percent = 0.7;
                // $percent = 0.7;
                if ($i > 0) {
                    $this->src = $to_source;
                }
                $image = $this->compressImg($to_source);
                $to_source_size = filesize($to_source) / 1024;
                // var_dump($to_source_size);
                
                $ys = $to_source_size > $maxFileSize;
                $i ++;
            }
            // echo "压缩次数:" . $i;
        }
        return true;
    }
}

PHP图片压缩到指定的大小相关推荐

  1. 图片不超过200kb怎么调整?一分钟学会图片压缩到指定大小

    很多网站为了保证页面的流畅度会限制图片上传的kb大小,所以我们需要把图片压缩到指定大小(图片压缩到指定大小 图片压缩大小至指定kb以下-压缩图),那么有没有比较快捷的方法可以自定义压缩图片大小呢?今天 ...

  2. 图片如何缩小到100k?怎么把图片压缩到指定大小?

    有时候在平台上传图片会规定大小100k,图片如何缩小到100k呢?可以使用压缩图的图片压缩到指定大小功能,十分的方便一键操作就可以将图片压缩到100k以内,来看看具体操作步骤吧. 1.打开压缩图点击图 ...

  3. 如何将图片压缩到指定大小?压缩图片大小的方法

    很多报名平台都对图片大小有固定的数值要求,所以不少小伙伴来问,怎么压缩图片200k以下(图片压缩到指定大小 图片压缩大小至指定kb以下-压缩图)?想要把图片压缩指定大小就要用到一些比较专业的工具,今天 ...

  4. 怎么把图片压缩到30k以内?如何图片压缩到指定大小?

    在公务员考试报名时,需要提交个人证件照片,通常都会要求照片大小不能超过30kb,否则会导致上传失败.那么怎么把图片压缩到30k以内呢?想要把图片压缩到30kb就需要用到压缩图的图片压缩指定大小(图片压 ...

  5. 图片怎么压缩到200k以内?图片压缩怎么指定大小?

    ​在某些情况下,我们需要将图片压缩到指定(https://www.yasuotu.com/imagesize)的大小,例如200k以内,在本文中,我们将用一个特别简单的方法来将图片压缩到200k以内的 ...

  6. JS将base64图片压缩至指定大小

    base64图片压缩至指定大小 在开发中,通常在上传图片时,由于各种限制,需要将上传的图片压缩到某一大小范围内才能上传.在此提供以下方法实现该需求,复制可用. /*** 压缩图片到指定大小* @par ...

  7. java 图片旋转_Java实现图片旋转、指定图像大小和水平翻转|chu

    本文实例为大家分享了Java实现图片旋转.指定图像大小.水平翻转,供大家参考,具体内容如下 package com.zeph.j2se.image; import java.awt.Graphics2 ...

  8. 图片大小如何调整到10k?图片压缩到指定大小怎么弄?

    在现代社交网络和在线平台上,上传的图片大小都会有限制,过大的图像会导致性能问题.加载时间延长和带宽消耗,所以图片压缩指定大小(https://www.yasuotu.com/imagesize)就成了 ...

  9. iOS图片压缩成指定大小

    在iOS中涉及一些图片显示和处理问题,在实际中碰到过修改账户头像时上传头像出现 error = Error Domain=com.alamofire.error.serialization.respo ...

最新文章

  1. 关于云计算 你所知道的可能不是真的
  2. python---简单的接口测试实例
  3. git提交输入密码_git提交到自己的服务器,每次都要输入密码
  4. boost::stl_interfaces::iterator_interface相关的测试程序
  5. 兔八哥与猎人(洛谷P1170题题解,Java语言描述)
  6. 怎么监听Android软键盘的打开和关闭
  7. 2017广州大学计算机组成原理,广州大学松田学院计算机组成原理复习题(仅供参考).doc...
  8. Android APK文件反编译 查看appid等信息
  9. JAVA面试题《下》
  10. C++---暂时的休憩
  11. python爬微信公众号视频_python爬虫公众号所有信息,并批量下载公众号视频
  12. 别人花了几万元学的英语,我帮你们免费弄来了
  13. css之-单行文本溢出显示省略号,多行文本溢出显示省略号
  14. ICM20602六轴传感器-IIC通信模式
  15. 计算机硬件intel的商标,电脑硬件配置品牌详细介绍推荐
  16. hub_thread
  17. 《动手学深度学习》笔记——深度学习简介
  18. 调试经验——使用Excel绘制二维向量值函数的曲线(等速螺线r(t)=(tcost)i+(tsint)j)
  19. vue生命周期函数、react生命周期函数、微信小程序生命周期函数、uni-app生命周期函数,简介及图示
  20. GIS原理学习——栅格数据的局域分析、领域分析及分区运算

热门文章

  1. 爷青回!最近很火的朋友圈怀旧小电视源码来啦!看到最后一个视频我大呼好家伙!
  2. oracle asm密码是什么,ASM有自己的参数、密码、alert、监听文件
  3. 记录四川移动盒子打开adb命令的方法 型号:UNT402H
  4. 知识共享协议与版权声明
  5. 数字孪生使用云流化的优势
  6. 大唐杯学习笔记(1)—— 5G网络架构与组网部署
  7. 微软的语音交互“滑铁卢”:Cortana小娜悲惨收场,未来路在何方?
  8. cox(Quaro)对设计的崭新定义,改变我的人生
  9. Rootkit技术基础(4)
  10. md500代码,异步电机,基于28379D,带无速度传感器控制,参数辨识,同步调制等功能