Linux环境—JPEG/JPG/PNG图片转换WEBP格式(二)

PHP源码编写

<?php
/**
 * Use : 将JPEG/JPG/PNG 的图片转换为 WEBP 格式
 * User:  yKan_SF
 * Date: 2018-2-27
 * Time: 下午8:22
 */
ini_set('display_errors',1);
class imagick_convert
{
    //原始图片绝对路径
    private $str_old_file = '';
    //转换webp默认扩展名
    private $str_default_ext = 'webp';
    //支持转换的图片格式
    private $arr_image_ext = null;

    /**
     * 默认构造函数
     */
    public function __construct($str_image_path)
    {
        $this->str_old_file = $str_image_path;
    }

    /**
     * Linux下ImageMagick + libwebp + php扩展imagick 转化 jpeg/jpg/png 图片文件
     * @param string $webp_dir webp图片的存储绝对路径
     * @return string  返回处理之后的图片绝对路径
     */
    public function convert_transform_images($webp_dir = '')
    {
        //文件是否存在
        if(!is_file($this->str_old_file))
        {
               //WEBP格式转换:待转换的图片路径不正确
            return $this->str_old_file;
        }
        //图片基本信息
        $ext = pathinfo($this->str_old_file,PATHINFO_EXTENSION);
        $ext = empty($ext) ? '' : strtolower($ext);
        //图片质量
        $this->arr_image_ext = array(
            'jpeg' => Imagick::COMPRESSION_JPEG,
            'jpg'  => Imagick::COMPRESSION_JPEG,
            'png'  => Imagick::COMPRESSION_UNDEFINED,
        );
        //根据后缀名把jpg或者png转成webp
        if(!in_array($ext, array_keys($this->arr_image_ext)))
        {
               //WEBP格式转换:暂不支持该格式转换,目前仅支持转换 jpeg,jpg和png 格式
            return $this->str_old_file;
        }
        //默认webp图片新路径
        if(empty($webp_dir))
        {
            $webp_dir = rtrim($this->str_old_file,$ext) . $this->str_default_ext;
        }
        //开始转换
        try
        {
            //原图的质量
            $new_q = $this->get_img_quality($ext);
            //转换成webp格式
            $this->do_jpg_transform_webp($webp_dir, $new_q);
        }
        catch(Exception $e)
        {
               //WEBP格式转换:工具转换异常,切换至GD库转换
            $webp_dir = $this->php_gd_image_webp($ext,$webp_dir);
        }
        //睡眠0.2秒
        usleep(20000);
        if(is_file($webp_dir))
        {
               //删除原始图片 + 设置WEBP图片访问权限
            chmod($webp_dir, 0777);
            unlink($this->str_old_file);
               //WEBP格式转换:转换成功
            return $webp_dir;
        }
          //WEBP格式转换:转换失败,返回原始图片路径
        return $this->str_old_file;
    }

    /**
     * 获取图片的质量
     * @param string $str_ext 图片扩展名
     * @return int 图片的质量
     */
    private function get_img_quality($str_ext)
    {
        $resource = new Imagick($this->str_old_file);
        //png特殊处理
        if($str_ext == 'png')
        {
            $resource->setImageFormat('PNG');
        }
        $resource->setImageCompression($this->arr_image_ext[$str_ext]);
        $current = $resource->getImageCompressionQuality();
        $resource->clear();
        $resource->destroy();
        if(!isset($current) || empty($current))
        {
            $current = 80;
        }
        $resource->clear();
        $resource->destroy();
        return $current;
    }

    /**
     * jpg/jpeg/png格式转换成webp格式
     * @param string $webp_img_path webp图片的真实路径
     * @param int $int_q 图片的压缩质量
     */
    private function do_jpg_transform_webp($webp_img_path, $int_q = 80)
    {
        exec("cwebp -q {$int_q} {$this->str_old_file} -o {$webp_img_path}");
    }

    /**
     * 应用PHP自身的GD库重新生成一张 webp 格式的图片,但是有概率生成空白图(有风险)
     * @param string $ext  文件扩展名
     * @param string $webp_img_path  生成webp文件的绝对路径
     * @return string 返回处理之后的图片绝对路径
     */
    private function php_gd_image_webp($ext,$webp_img_path)
    {
        //jpg处理使用jpeg
        $ext = $ext == 'jpg' ? 'jpeg' : $ext;
        //拼接函数名 imagecreatefromjpeg 还是 imagecreatefrompng
        $funName = 'imagecreatefrom' . $ext;
        //开始转换
        $obj_img = null;
        try
        {
            //打开这个图片资源
            $obj_img = $funName($this->str_old_file);
            //用这个图片资源创建一个webp图片, 存在路径$tdir
            imagewebp($obj_img,$webp_img_path);
        }
        catch(Exception $e)
        {

        }
        //销毁画布资源
        if($obj_img != null)
        {
            imagedestroy($obj_img);
        }
        //睡眠0.3秒
        return $webp_img_path;
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值