Так получилось, что в курируемом мной магазине большинство изображений товаров имеют вокруг изображения самого товара огромные пустые поля.
Я решил данную проблему путем рекурсивного обхода папки image/import_files и обработкой всех файлов изображений функцией trimImage.
Раньше в этой теме была просьба о помощи в решение проблемы порчи изображений товаров при обрезании краев и последующем ресайзе. Видимо, что-то пошло не так при первом проходе скрипта. При повторном запуске все проблемы исчезли сами собой :).
Раз проблема решена сама собой, поделюсь с сообществом этим обработчиком:
<?php
trimProductImages(DIR_IMAGE."import_files/");
// В качестве аргумента передаем путь(имя) до папки.
function trimProductImages($patch) {
$handle = opendir($patch);
while(($file = readdir($handle))) {
set_time_limit(0);
if (is_file ($patch."/".$file) && (getExtension1($file) == "jpg" || getExtension1($file) == "jpeg" || getExtension1($file) == "png") )
{
echo $patch . "/" . $file . "\n";
$image = new Imagick($patch."/".$file);
$image->trimImage(0);
$image->writeImage($patch."/".$file);
}
if (is_dir ($patch."/".$file) && ($file != ".") && ($file != ".."))
{
/* рекусрсивно проходим по директории*/
trimProductImages($patch."/".$file); // Обходим вложенный каталог
}
}
closedir($handle);
}
function getExtension1($filename) {
// Возвращаем расширение файла
return substr($filename, strrpos($filename, '.') + 1);
}
?>
Установка:
сохранить скрипт в папку images/import_files/
запустить в браузере
Обязательно делайте бекап папки изображений, перед тем как запускать скрипт!
Если видите испорченные изображения, значит у вас тоже что-то пошло не так и необходимо произвести процедуру повторно.
Ни в коем случае не запускайте обработчик на боевом сервере! Только на локальной машине с последующей заменой файлов изображений на рабочем сайте на полученные в результате работы скрипта.
Для работы скрипта требуется PHP с ImageMagick.
Так как изображений может быть несколько тысяч, задайте в php.ini максимальное время выполнения скрипта в (max_execution_time) в районе нескольких минут.