WordPress.org

Ready to get started?Download WordPress

Forums

ImageMagick for thumbnails (3 posts)

  1. alexwein
    Member
    Posted 8 years ago #

    I love WordPress RC3. It is just wonderful. New support for uploading pictures right where you post stuff is plain awesome.

    I had one problem, though - my host does not have PHP compiled with GD, so thumbnail generation were not working for me. At the same time, I have shell access, and it was really easy for me to download ImageMagick command line utility - which I did. I'm sure some users might be in the same situation, so I'll share my findings.

    Maybe the developers of WordPress will even consider including support for ImageMagick in the final release - since it should be very easy (took me only 1 hour).

    But first - why use ImageMagick?
    1) ImageMagick does not have to be compiled with PHP - very easy option when you don't have GD.
    2) ImageMagick is faster than GD and generates better quality thumbnails. It's the library of choice for many gallery projects.

    How do I get ImageMagick to work on my site?
    a) Download ImageMagick package from http://www.imagemagick.org/script/download.php
    b) Untar, put in a directory where the web server can execute the binaries.
    c) Make minor (almost tiny!) changes to wp-admin/admin-functions.php:

    1) Find the function wp_create_thumbnail(). Add the following as its first line:
    return alex_hack_thumbnail_using_imagemagick($file, $max_side, $filter);

    2) Copy the following function above wp_create_thumbnail():

    function alex_hack_thumbnail_using_imagemagick($file, $max_side, $filter = '') {
    // FIX THIS TO POINT TO YOUR IMAGEMAGICK INSTALLATION!!!
    // Make sure that the web server can execute scripts from this directory.
    $PATH_TO_CONVERT = "/home/alex94040/imagemagick/bin/";

    if (file_exists($file)) {
    $image_attr = getimagesize($file);

    $image_attr = getimagesize($file);

    // figure out the longest side

    if ($image_attr[0] > $image_attr[1]) {
    $image_width = $image_attr[0];
    $image_height = $image_attr[1];
    $image_new_width = $max_side;

    $image_ratio = $image_width / $image_new_width;
    $image_new_height = $image_height / $image_ratio;
    //width is > height
    } else {
    $image_width = $image_attr[0];
    $image_height = $image_attr[1];
    $image_new_height = $max_side;

    $image_ratio = $image_height / $image_new_height;
    $image_new_width = $image_width / $image_ratio;
    //height > width
    }

    // If no filters change the filename, we'll do a default transformation.
    if ( basename($file) == $thumb = apply_filters('thumbnail_filename', basename($file)) )
    $thumb = preg_replace('!(\.[^.]+)?$!', __('.thumbnail').'$1', basename($file), 1);

    $thumbpath = str_replace(basename($file), $thumb, $file);

    $convert_str = $PATH_TO_CONVERT.'convert'.
    ' -sample '.$image_new_width.'x'.$image_new_height. // new size
    ' "'.$file.'"'. // source file to convert
    ' "'.$thumbpath.'"'; // destination file = thumbnail
    exec($convert_str, $array_output, $return_value); // call ImageMagick command line utility to do the conversion
    if($return_value != 0) {
    $error = __('Error while creating image '.$file.'! <br>Return Value: '.$return_value.', output:<br>');
    $error .= __("<br>Command: ".$convert_str.'<br>');
    }
    } else {
    $error = __('File not found');
    }

    if (!empty ($error)) {
    return $error;
    } else {
    return $thumbpath;
    }
    }

    3) Correct the path to the imagemagick installation in the $PATH_TO_CONVERT variable in the code that you just pasted.

    Good luck!!

  2. hahakid
    Member
    Posted 8 years ago #

    Thanks!!
    You saved me a looot of hassle.

  3. mywebcache
    Member
    Posted 7 years ago #

    Alex, one huge change you didn't make was using the "-thumbnail" switch instead of the "-size" switch. Try this, it makes a huge difference. Or, try -density xx (where x is something pretty big >300) and then "-geometry" instead of "-size". These changes make a HUGE quality difference over "-size". It takes away the grainess. Try it for yourself.

Topic Closed

This topic has been closed to new replies.

About this Topic