вопрос
С помощью ChatGPT сделал функцию, которая создает из 4 картинок одну картинку-коллаж. Замучил ChatGPT, пытаясь добавить отступы между картинками, так и не смог добиться результата, ни одно из предложенных решений не работает...
Помогите решить проблему пожалуйста.
function getCollage($images, $newsid, $size) {
global $config;
$pattern = '/<img\s+[^>]*src="([^"]+\.(jpg|jpeg|png|gif|webp|jfif))"/i';
preg_match_all($pattern, $images, $matches);
$imagePaths = $matches[1];
$ext = 'webp'; // Формат итогового изображения - jpg, webp, png
if (count($imagePaths) >= 4) {
// Размеры ячейки (в которой будет одно изображение)
if ($size) {
if (strpos($size, 'x') !== false) {
$sizes = explode('x', $size);
$cellWidth = $sizes[0] / 2;
$cellHeight = $sizes[1] / 2;
} else {
$cellWidth = $config['max_image'] / 2;
$cellHeight = ($cellWidth / 4) * 3;
}
} else {
if (isset($config['max_image'])) {
if (strpos($config['max_image'], 'x') !== false) {
$sizes = explode('x', $config['max_image']);
$cellWidth = $sizes[0] / 2;
$cellHeight = $sizes[1] / 2;
} else {
$cellWidth = $config['max_image'] / 2;
$cellHeight = ($cellWidth / 4) * 3;
}
} else {
$cellWidth = 200;
$cellHeight = 150;
}
}
// Путь к директории temp
$tempDir = 'uploads/posts/collage/';
// Создаем директорию, если она не существует
if (!file_exists($tempDir)) mkdir($tempDir, 0777, true);
// Полное имя файла коллажа
$collageFilename = $tempDir . $newsid.'_collage.'.$ext;
// Проверяем, существует ли файл коллажа
if (!file_exists($collageFilename)) {
// Создаем пустой холст для коллажа
$collageWidth = $cellWidth * 2; // Ширина коллажа (2 ячейки в ряду)
$collageHeight = $cellHeight * 2; // Высота коллажа (2 ячейки в столбце)
$collage = imagecreatetruecolor($collageWidth, $collageHeight);
// Задаем начальные координаты для изображений
$imageX = 0;
$imageY = 0;
// Обрабатываем каждое изображение и добавляем на холст
foreach ($imagePaths as $index => $imagePath) {
$image = imagecreatefromjpeg(trim($imagePath)); // Убираем лишние пробелы
$imageWidth = imagesx($image);
$imageHeight = imagesy($image);
// Вычисляем коэффициенты масштабирования по ширине и высоте
$scaleWidth = $cellWidth / $imageWidth;
$scaleHeight = $cellHeight / $imageHeight;
// Выбираем максимальный коэффициент, чтобы изображение точно поместилось в ячейку
$scale = max($scaleWidth, $scaleHeight);
// Вычисляем новые размеры изображения
$newWidth = $imageWidth * $scale;
$newHeight = $imageHeight * $scale;
// Создаем временное изображение для масштабирования и обрезки
$tempImage = imagecreatetruecolor($cellWidth, $cellHeight);
// Масштабируем и обрезаем изображение
$dstX = ($cellWidth - $newWidth) / 2;
$dstY = ($cellHeight - $newHeight) / 2;
imagecopyresampled($tempImage, $image, $dstX, $dstY, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight);
// Копируем изображение на холст
imagecopy($collage, $tempImage, $imageX, $imageY, 0, 0, $cellWidth, $cellHeight);
// Обновляем координаты для следующей ячейки
$imageX += $cellWidth;
// Переходим на новую строку, если достигнут конец ряда
if ($imageX >= $collageWidth) {
$imageX = 0;
$imageY += $cellHeight;
}
// Прерываем, если все ячейки заполнены
if ($imageY >= $collageHeight) break;
// Освобождаем память от временного изображения
imagedestroy($tempImage);
}
if ($ext === 'webp') imagewebp($collage, $collageFilename); // Сохраняем изображение в файл в формате WebP
else if ($ext === 'png') imagepng($collage, $collageFilename); // Сохраняем изображение в файл в формате PNG
else imagejpeg($collage, $collageFilename); // Сохраняем изображение в файл в формате JPG
// Освобождаем память
imagedestroy($collage);
}
return '/'.$collageFilename;
} else return (count($imagePaths)) ? $imagePaths[0] : '/templates/'.$config['skin'].'/dleimages/no_image.jpg';
}
Помогите решить проблему пожалуйста.