Once upon a time, I found myself in possession of a vast amount of wallpapers. I’m talking well over 10,000, all in one folder. That’s not to helpful since a lot of them were repeats in different dimensions. After realizing that I couldn’t just add a ’sort by dimension’ field in explorer, I set about on a mission using a method I knew would work, PHP with the GD (Graphics Display) library.
The core of this script is based around the ability for GD to pull the dimensions of a picture quickly and efficiently. The goal is to get php to look in a directory and sort all their files by dimensions we define (this will help filter out any pictures in other dimensions present in the folder).
So the sorting cycle looks something like this:
$totalFiles=count($file); for ($j=0; $j < $totalFiles; $j++) { $dimension=getimagesize("$dir$file[$j]"); for($k=0; $k < $totalFolders; $k++) if($dimension[0] == $width[$k] && $dimension[1] == $height[$k]) { movefile($dir, $file[$j], "$dir$width[$k]x$height[$k]"); $sorted++; if ($sorted%50==0) { echo $sorted." files sorted | ".round(100*($sorted/$totalFiles),2)."%\n"; } } }
However, the folder is currently non-existent but we’re not going to open up explorer and create them ourself, especially since we plan on having an array hold our dimension values.
Here’s what I did:
$width = array(800,1024,1152,1280,1280,1280,1440,1600,1680,1920); $height = array(600,768,864,800,960,1024,900,1200,1050,1200); if (count($width) != count($height)) // Make sure the arrays are the same length exit ("Non-matching array lengths: ".count($width)." widths with ".count($height)." heights."); $totalFolders=count($width); for($i=0; $i < $totalFolders; $i++) // Create directories based on the arrays if they haven't been created already if (!file_exists("$dir$width[$i]x$height[$i]")) { mkdir("$dir$width[$i]x$height[$i]"); echo "Folder $width[$i]x$height[$i] created\n"; }
The rest of the code is all pretty straight forward. I added in some job statistics (percentages and amount of time to complete). I have to find my pictures of the output but I believe it went through all the wallpapers in ~110 seconds. Anyway, here’s the script in it’s entirety, I hope it helps :).
<?php $dir = "pics/"; // The directory (trailing slash) $dh = opendir($dir); // Open the directory $m_time = explode(" ",microtime()); // These two lines get the start time $starttime = $m_time[0] + $m_time[1];// $width = array(800,1024,1152,1280,1280,1280,1440,1600,1680,1920); $height = array(600,768,864,800,960,1024,900,1200,1050,1200); if (count($width) != count($height)) // Make sure the arrays are the same length exit ("Non-matching array lengths: ".count($width)." widths with ".count($height)." heights."); $totalFolders=count($width); for($i=0; $i < $totalFolders; $i++) // Create directories based on the arrays if they haven't been created already if (!file_exists("$dir$width[$i]x$height[$i]")) { mkdir("$dir$width[$i]x$height[$i]"); echo "Folder $width[$i]x$height[$i] created\n"; } // Create an array of the file names while (false !== ($filename = readdir($dh))) { if (!is_dir($dir.$filename)) $file[] = $filename; } if (!isset($file)) exit ("No files in this directory."); $sorted=0; $totalFiles=count($file); for ($j=0; $j < $totalFiles; $j++) { $dimension=getimagesize("$dir$file[$j]"); for($k=0; $k < $totalFolders; $k++) if($dimension[0] == $width[$k] && $dimension[1] == $height[$k]) { movefile($dir, $file[$j], "$dir$width[$k]x$height[$k]"); $sorted++; if ($sorted%50==0) { echo $sorted." files sorted | ".round(100*($sorted/$totalFiles),2)."%\n"; } } } $m_time = explode(" ",microtime()); // These two lines get the end time $endtime = $m_time[0] + $m_time[1]; // echo "\n".$sorted." files have been sorted in ". round(($endtime - $starttime),3) ." seconds.\n"; echo "That's ".(1/(round(($endtime - $starttime),3)/$sorted))." files per second!"; function movefile($dir, $theFile, $newDir) { if (!copy($dir.$theFile, "$newDir/$theFile")) echo "failed to copy $theFile...\n"; else unlink($dir.$theFile); } ?>
Note: This script should be called from the command line.

