Дано: файлы форматов jpg (jpeg) и png разных размеров (небольшие, порядка 300Кб максимум).
Требуется: сформировать изображения, соблюдая пропорции, размером 110х110, и поместить на белый фон размером 120х120 (чтобы хоть какой-то минимальный отступ был).
Попытки реализации:
Без проверки на тип данных:
public static function imageResize($out,$in,$weight,$height,$quality) {
$im=imagecreatefromjpeg($in);
$im1=imagecreatetruecolor($weight,$height);
imagecopyresampled($im1,$im,0,0,0,0,$weight,$height,imagesx($im),imagesy($im));
imagejpeg($im1,$out,$quality);
imagedestroy($im);
imagedestroy($im1);
}
...
$path=$rootPath."/1c/img/".$product->image;
$realImage=$rootPath."/products/".$product->image;
...
helper::imageresize($realImage,$path,120,120,100);
Проблемы: ругается на png (я ж не проверяю формат), выходные изображения непропорциональны, изображения из png создаются просто черными.
С проверкой, но без пропорций:
public static function getImage($path){
$mime = mime_content_type($path);
switch($mime) {
case 'image/png':
$img = imagecreatefrompng($path);
break;
case 'image/gif':
$img = imagecreatefromgif($path);
break;
case 'image/jpeg':
$img = imagecreatefromjpeg($path);
break;
default:
$img = null;
}
return $img;
}
...
$realImage=$rootPath."/products/".$product->image;
...
$gdImage=helper::getImage($path);
$im = imagecreatetruecolor(120, 120);
imagejpeg($gdImage, $realImage);
imagedestroy($gdImage);
Проблемы: изображения просто копируются одно в другое (с исходными размерами), изображения из png скопировались, но встали на черном фоне.
То есть, в первом случае, я работаю с реальными изображениями, а во втором с объектами, и как объединить оба способа я не знаю. К тому же требуется еще создать пустое белое изображение и поместить на него пропорциональное подготовленное изображение. Также очень важно, чтобы конечные jpg файлы были именно jpg, чтобы потом, при последующем копировании, я не делал проверки на тип данных (мне потом это все через PHPExcel размещать в файле нужно будет (но там уже все готово)).
P.S. За многоточиями опущено получение записей из БД и цикл, в котором выполняется этот код.
P.P.S. @teran, огромное спасибо! Вот что получилось, благодаря Вашим наводкам, может кому и пригодится (комментарии просто для пояснения):
public static function imageResize($out,$in,$width,$height,$quality) {
//создаем новое изображение из входного с проверкой типа файла
$im=self::getImage($in);
//создаем новое пустое изображение, заданных размеров
$im1=imagecreatetruecolor($width,$height);
//заполняем только что созданное изображение
//белым цветом (по умолчанию создается с черным фоном)
imagefill($im1,0,0,imagecolorallocate($im1, 255, 255, 255));
//копируем входное изображение в только что созданное и покрашенное с
//сохранением пропорций (сильно не пинайте, как понял, так и написал)
imagecopyresampled($im1,$im,0,0,0,0,$width,$height,imagesx($im),imagesy($im));
//создаем новое JPG изображение и удаляем экземпляры,
//с которыми работали в памяти
imagejpeg($im1,$out,$quality);
imagedestroy($im);
imagedestroy($im1);
}
P.P.P.S. Сделал как сумел, может есть более правильные решения данной задачи? Единственное с чем несправился так это с добавлением бордюров по краям изображения, то есть ужать исходник до 110х110 и поместить на холст в 120х120, правда изображения итак мелкие, но может пригодится в будущем.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости