Sesuriti
Продвинутый
Дата регистрации:
24.04.2013 16:20:53
Сообщений: 72
Привет! Помогите доработать скрипт генерации фото коллажа.
Сейчас скрипт работает таким образом, что фотографии заполняют прямоугольник подстраиваясь пропорционально под нужные размеры.
Но мне нужно, что бы можно было делать примерно так как на скриншоте
http://imagizer.imageshack.com/img923/1609/xpuA7L.png
Sesuriti
Продвинутый
Дата регистрации:
24.04.2013 16:20:53
Сообщений: 72
$max_size = $this->max_size;
$widths = array();
$heights = array();
foreach ($images as $image) {
$source = $this->createFrom($image);
$heights[] = imagesy($source);
}
$averageRowHeight = array_sum($heights) / count($heights);
foreach ($images as $image) {
$source = $this->createFrom($image);
$width = imagesx($source);
$height = imagesy($source);
$widths[] = round($width / $height * $averageRowHeight);
}
$gap = isset($settings['cover_gap']) ? $settings['cover_gap'] : 50; // Отступы между картинками
$index = 0;
$rowNumber = 0;
$rows = array();
$reduceArraySum = ceil(array_reduce($widths, 'reduceArraySum' / $max_size);
$max_len = (count($widths) > 4) ? 3 : 2;
$rows = array_chunk($widths, $max_len);
$areaWidth = 0;
$areaHeight = 0;
$sizes = array();
for ($i = 0; $i < count($rows); $i++) {
if (empty($rows[$i])) continue;
$rowWidth = 0; $rowHeight = 0;
for ($j = 0; $j < count($rows[$i]); $j++) {
if (empty($rows[$i][$j])) continue;
$k = ($max_size - (count($rows[$i]) - 1)) / array_reduce($rows[$i], 'reduceArraySum';
$width = $rows[$i][$j] * $k;
$height = $k * $averageRowHeight;
$sizes[$i][$j] = array($width, $height);
$rowWidth += $width;
if ($rowHeight < $height) {
$rowHeight = $height;
}
}
if ($areaWidth < $rowWidth) {
$areaWidth = $rowWidth + $gap;
} $areaHeight += $rowHeight + $gap;
}
$areaWidth = floor($areaWidth);
$areaHeight = floor($areaHeight);
$collage = imagecreatetruecolor($areaWidth, $areaHeight);
$r = 255; $g = 255; $b = 255;
if (!empty($settings['background'])) {
list($r, $g, $b) = $this->hex2rgb($settings['background']);
}
$bg = imagecolorallocate($collage, $r, $g, $b);
imagefill($collage, 0, 0, $bg);
$n = 0; $x = $gap / 2; $y = $gap / 2;
foreach ($sizes as $i => $arRowSize) {
foreach ($arRowSize as $j => $arCellSize) {
if (empty($images[$n])) continue;
$filename = $images[$n];
$image = $this->createFrom($filename);
$origWidth = imagesx($image);
$origHeight = imagesy($image);
list($newWidth, $newHeight) = $arCellSize;
imagecopyresampled($collage, $image, $x, $y, 0, 0, $newWidth, $newHeight, $origWidth, $origHeight);
imagedestroy($image);
$n++;
$x += $newWidth;
}
$x = 0;
$y += $newHeight;
}
$collagename = "collage.jpg";
$collagepath = $image_path.$collagename;
imagejpeg($collage, $collagepath, 100);
imagedestroy($collage);