Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I'm trying to take existing images and shrink the file size down by resizing to photos to a smaller resolution. I've tried a few methods so far:

  1. Simply editing the photo in photoshop and reuploaded, replacing the existing (and larger) file.
  2. I tried the Imsanity plugin and set the options to be less than 1024x1024 and then bulk resized the images without failure (but it did not do the trick).
  3. I also tried the Regenerate Thumbnails plugin, and ran the rebuild without failure (but it did not resize the photos).

Maybe there is a better or a right way to accomplish what I'm doing, but I can't seem to find anything on this issue.

I'm running a Multisite install and WP FTP is not enabled and can't be enabled to solve this.

share|improve this question
add comment

2 Answers

up vote 4 down vote accepted

You can perform a combination of things to accomplish a smaller file size. Let me guide you through it.

Firstly, you could add custom image sizes and adjust the dimensions to the very smallest for their purpose. Put the following in your functions file:

function my_insert_custom_image_sizes( $sizes ) {
    // get the custom image sizes
    global $_wp_additional_image_sizes;
    // if there are none, just return the built-in sizes
    if ( empty( $_wp_additional_image_sizes ) )
        return $sizes;

    // add all the custom sizes to the built-in sizes
    foreach ( $_wp_additional_image_sizes as $id => $data ) {
        // take the size ID (e.g., 'my-name'), replace hyphens with spaces,
        // and capitalise the first letter of each word
        if ( !isset($sizes[$id]) )
            $sizes[$id] = ucfirst( str_replace( '-', ' ', $id ) );
    }

    return $sizes;
}


function custom_image_setup () {
    add_theme_support( 'post-thumbnails' );
    add_image_size( 'small', 160, 9999 ); //  small
    add_image_size( 'medium', 300, 9999 ); //  medium
    add_image_size( 'large-cropped', 578, 200, true ); //  cropped
    add_filter( 'image_size_names_choose', 'my_insert_custom_image_sizes' );
}

add_action( 'after_setup_theme', 'custom_image_setup' );

So, my_insert_custom_image_sizes adds your custom images to the Media uploader window and I have added a few random sizes in the custom_image_setup.

Next, we will need to set the JPEG compression value for each of these sizes. Observe the following:

add_filter('jpeg_quality', create_function('$quality', 'return 100;'));

add_action('added_post_meta', 'ad_update_jpeg_quality', 10, 4);

function ad_update_jpeg_quality($meta_id, $attach_id, $meta_key, $attach_meta) {

    if ($meta_key == '_wp_attachment_metadata') {

        $post = get_post($attach_id);

        if ($post->post_mime_type == 'image/jpeg' && is_array($attach_meta['sizes'])) {

            $pathinfo = pathinfo($attach_meta['file']);
            $uploads = wp_upload_dir();
            $dir = $uploads['basedir'] . '/' . $pathinfo['dirname'];

            foreach ($attach_meta['sizes'] as $size => $value) {

                $image = $dir . '/' . $value['file'];
                $resource = imagecreatefromjpeg($image);

                if ($size == 'large') {
                    // set the jpeg quality for 'large' size
                    imagejpeg($resource, $image, 35);
                } elseif ($size == 'medium') {
                    // set the jpeg quality for the 'medium' size
                    imagejpeg($resource, $image, 40);
                } elseif ($size == 'small') {
                    // set the jpeg quality for the 'small' size
                    imagejpeg($resource, $image, 40);
                } elseif ($size == 'large-cropped') {
                    // set the jpeg quality for the 'large-cropped' size
                    imagejpeg($resource, $image, 45);
                } else {
                    // set the jpeg quality for the rest of sizes
                    imagejpeg($resource, $image, 60);
                }

                // or you can skip a particular image size
                // and set the quality for the rest:
                // if ($size == 'splash') continue;

                imagedestroy($resource);
            }
        }
    }
}

As the comments demonstrate, this part sets the compression value: imagejpeg($resource, $image, VALUE). You will need to play around a little bit and find out what value works best with which image size. I set 60% compression for the rest of images.

The code above affects only newly updated images. If you wish to run a script that will change your existing images, in your plugin folder, add a new folder and create a new php file with this code inside:

<?php
/*
Plugin Name: Compression JPEG Quality
Plugin URI: http://domain.com
Description: This plugin will change the jpeg image quality according to its size.
Author: Christine
Version: 1.0
Author URI: http://domain.com
*/

register_activation_hook(__FILE__, 'ad_modify_jpeg_quality');

function ad_modify_jpeg_quality() {

    $attachments = get_posts(array(
        'numberposts' => -1,
        'post_type' => 'attachment',
        'post_mime_type' => 'image/jpeg'
    ));

    if (empty($attachments)) return;

    $uploads = wp_upload_dir();

    foreach ($attachments as $attachment) {

        $attach_meta = wp_get_attachment_metadata($attachment->ID);
        if (!is_array($attach_meta['sizes'])) break;

        $pathinfo = pathinfo($attach_meta['file']);
        $dir = $uploads['basedir'] . '/' . $pathinfo['dirname'];

        foreach ($attach_meta['sizes'] as $size => $value) {

            $image = $dir . '/' . $value['file'];
            $resource = imagecreatefromjpeg($image);

                    if ($size == 'large') {
                        // set the jpeg quality for 'large' size
                        imagejpeg($resource, $image, 35);
                    } elseif ($size == 'medium') {
                        // set the jpeg quality for the 'medium' size
                        imagejpeg($resource, $image, 40);
                    } elseif ($size == 'small') {
                        // set the jpeg quality for the 'small' size
                        imagejpeg($resource, $image, 40);
                    } elseif ($size == 'large-cropped') {
                        // set the jpeg quality for the 'large-cropped' size
                        imagejpeg($resource, $image, 45);
                    } else {
                        // set the jpeg quality for the rest of sizes
                        imagejpeg($resource, $image, 60);
                    }

            imagedestroy($resource);
        }
    }
}
?>

Finally, add the WP Smush.it plugin which will bring down the file sizes even further.

A few notes to consider:

  • None of this affects PNG file uploads. Your only option with this file format is to add a plugin that will convert PNG to JPEG however this will mean that transparency will not work. Another desperate solution would be to have all PNG files converted to PNG 8-bit file format which is limited to 256 colours. However, that would take your uploads back to the 90's.
  • The compression will not affect the Full size size option. This is the original file upload. If you are running a multiple author site and want to avoid your authors adding this filesize, you could add a filter to remove this file size from the drop down list.
  • These codes have been tested and functions fine with both Wordpress v3.4.2 and v3.5
share|improve this answer
    
Did this answer help you? If so, please consider upvoting and accepting this answer as correct, you can do this by clicking on the checkmark. –  Christine Cooper Dec 22 '12 at 9:38
add comment

You can use wp-smush it plugin http://wordpress.org/extend/plugins/wp-smushit/

It reduces the size of images

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.