• wordpress图片上传压缩
  • 雪峰 发表于 2016-06-27 标签:
  • 由于服务器的空间比较小,只有1G的空间(毕竟是阿里云的免费虚拟服务器)。再加上又不太想弄七牛那些作为图床,本身也不要求高清图片,所以想着把上传的图片给压缩以节省空间。可是网上给出的代码无一都是雷同的结构。

    <?php
    add_filter( 'jpeg_quality', 'bavotasan_custom_jpeg_quality' );
    function bavotasan_custom_jpeg_quality( $quality ) { 
     return 100; 
    }
    ?>

    而他们几乎没有人提到这段代码的具体作用,只是说把代码添加到functions文件中就能压缩jpg图片了,可是试了好多遍也不见效果,该多大就多大,于是我不停的google,终于发现了答案。原来这段代码只对上传后所裁剪的图片(即各种缩略图)进行压缩,并不会对原图片文件进行压缩!!!

     

    所幸的是,在google找了很多次后,终于发现一位机智的大神给出了正确的答案,关键就在于filter的使用,他给出的filter为wp_handle_upload,而不是其他人所说的jpeg_quality这个,然后我把他给出的代码贴到functions文件中后,惊奇的发现居然奏效了!!!(心里有点小激动)利用的就是php自带的imagejpeg这个函数自带的压缩参数。

    经试验,将image quality参数设为60(0-100),发现基本能把500k到2M的图片压缩至50k到90k之间,这压缩效果简直不能再好了,而且基本没有模糊,尺寸也不需要改变。

    这是那位大神贴出的代码:链接地址(http://wordpress.stackexchange.com/questions/193617/how-to-change-compression-of-wordpress-uploads-including-original-image

    function wt_handle_upload_callback( $data ) {
     $image_quality = 30; // Change this according to your needs
     $file_path = $data['file'];
     $image = false;
    
     switch ( $data['type'] ) {
     case 'image/jpeg': {
     $image = imagecreatefromjpeg( $file_path );
     imagejpeg( $image, $file_path, $image_quality );
     break; 
     }
    
     case 'image/png': {
     $image = imagecreatefrompng( $file_path );
     imagepng( $image, $file_path, $image_quality );
     break; 
     }
    
     case 'image/gif': { 
     // Nothing to do here since imagegif doesn't have an 'image quality' option
     break;
     }
     }
    
     return $data;
    }
    add_filter( 'wp_handle_upload', 'wt_handle_upload_callback' );

    可以根据自身需要设置quality的值,个人推荐60.这段代码有一处错误,就是imagepng并没有quality这个参数(要是有的话就好了),所以需要改进一下。

    改进后:

    
    function wt_handle_upload_callback( $data ) {
    $image_quality = 60; // Change this according to your needs
    $file_path = $data['file'];
    $image = false;
    switch ( $data['type'] ) {
    case 'image/jpeg': {
    $image = imagecreatefromjpeg( $file_path );
    imagejpeg( $image, $file_path, $image_quality );
    break;
    }
    
    case 'image/png': {
    $image = imagecreatefrompng( $file_path );
    imagejpeg( $image, $file_path, $image_quality );//注意,imagepng并没有quality这个选项,使用imagejpeg则不会保存png的rgba通道,即没有透明度
    break;
    }
    <pre>case 'image/gif': {
     // Nothing to do here since imagegif doesn't have an 'image quality' option
     break;
     }
     }
     return $data;
    }
    add_filter( 'wp_handle_upload', 'wt_handle_upload_callback' );

    改进后有点不足的是,png图片的透明通道并不会被保存,但目前并没有发现图片变黑的情况,而且,只要你想完全可以将代码优化的更好,更强大,毕竟钩子用对了。

    发表回复