Create a thumbnail in PHP with imagemagick and rename accordingly

Written by - 0 comments

Published on - last updated on March 13th 2019 - Listed in PHP

As I'm programming my new blog, I am also renewing the admin section. When I created the first version with the "article" system, I always had to create an article first and then later upload pictures to the article.

In the new version this can be done while I write the initial article. I've been using Xinha as editor since 2011 and was always happy with it. I was ready to ditch Xinha for another editor (e.g. tinymce) because what was really missing was a direct file uploader. Looks like Xinha got this now with the plugin MootoolsFileManager.

Xinha MootoolsFileManager

Once I got the plugin to work, I had yet to figure out a way how thumbnails would be created and would be saved besides the original name with a "_tn", right before the file suffix.

In the MootoolsFileManager plugin folder, there is a file "mootools-filemanager/Assets/Connector/FileManager.php". This particular file is in charge for the image uploads and resizing. Although there is resizing involved, it basically only resizes the uploaded picture if it's larger than a defined height and width. This is handled by the following part of the PHP script:

if (FileManagerUtility::startsWith($mime, 'image/'))
  if (!empty($resize_imgs))
    $img = new Image($file);
    $size = $img->getSize();
    // Image::resize() takes care to maintain the proper aspect ratio, so this is easy
    // (default quality is 100% for JPEG so we get the cleanest resized images here)
    $img->resize($this->options['maxImageDimension']['width'], $this->options['maxImageDimension']['height'])->save();

    // source image has changed: nuke the cached metadata and then refetch the metadata = forced refetch
    $meta = $this->getFileInfo($file, $legal_url, true);

To create the thumbnail, I decided to use the PHP extension "Imagemagick" and use the $file value. To create a thumbnail, there is a dedicated function available: thumbnailImage. However I read the comment from user "Jarrod" and decided to use his code for the resizing and compression.

First define the size of the thumbnail, followed by creating a new Imagick object. This uses the already defined $file value.After this the resizing and compression happens:

$image = new Imagick($file);
if($image->getImageHeight() <= $image->getImageWidth()) {
  // Resize image using the lanczos resampling algorithm based on width
} else {
  // Resize image using the lanczos resampling algorithm based on height
// Set to use jpeg compression
// Set compression level (1 lowest quality, 100 highest quality)
// Strip out unneeded meta data

Now to the part where I struggled: I wanted to write the thumbnail to the same location as the original file just with a minor file name change:


This created the following error message when I uploaded a new picture:

unable to open image `/path/to/website/graph/news/test//path/to/website/graph/news/5964444389069276856_1.jpg': No such file or directory @ error/blob.c/OpenBlob/2701

But $file obviously contains the whole path of the file, not just the filename. Now I needed to find a way to get the filename from $file.

To split the full path into different variables, the PHP function "pathinfo" can be used:

$imagefilename = pathinfo($image->getImageFilename());
echo "DEBUUUG Filename" . $imagefilename['filename'] ."
echo "DEBUUUG Basename " . $imagefilename['basename'] ."
echo "DEBUUUG Extension " . $imagefilename['extension'] ."

This gives the following output:

DEBUUUG Filename 3536899305055346748_account_id_1
DEBUUUG Basename 3536899305055346748_account_id_1.jpg
DEBUUUG Extension jpg

Using these values I can now rename and write the thumbnail into the same location as the original file:


Add a comment

Show form to leave a comment

Comments (newest first)

No comments yet.