Скрипт для генерации эффектных коллажей
Скрипт для генерации эффектных коллажей
Не секрет, что при оформлении статей мне очень нравится использовать коллажи в виде нескольких фотографий, "набросанных" одна на другую. Для этого можно использовать специальные программы или графические редакторы, но я решил пойти чуть дальше и написать скрипт на PHP, который будет генерировать такие изображения. Теперь он используется у меня на фотосайте для генерации превьюшек галерей. Вы можете без особого труда модифицировать его для своих нужд.
Для работы понадобится вспомогательная функция для совмещения изображений с альфа-каналом. Ее параметры аналогичны функции ImageCopyMerge, последний параметр - значение прозрачности для накладываемого изображения. Функция очень полезная, наверняка пригодится и в других случаях.
Code (PHP) : Убрать нумерацию
- //-----------------------------------------------------------------------
- // Вспомогательная функция для совмещения изображений с альфа-каналом
- //-----------------------------------------------------------------------
- function ImageCopyMergeAlpha($dst_im, $watermark, $dst_x, $dst_y,
- $src_x, $src_y, $src_w, $src_h, $pct){
- if (!isset($pct)) {
- return false;
- }
- $pct/=100;
- $w=ImageSX($watermark);
- $h=ImageSY($watermark);
- ImageAlphaBlending($watermark, false);
- $minalpha=127;
- for ($x=0; $x<$w; $x++)
- for ($y=0; $y<$h; $y++) {
- $alpha=(ImageColorAt($watermark,$x,$y)>>24) & 0xFF;
- if ($alpha<$minalpha) {
- $minalpha=$alpha;
- }
- }
- for ($x=0; $x<$w; $x++) {
- for ($y=0; $y<$h; $y++){
- $colorxy=ImageColorAt($watermark,$x,$y);
- $alpha=($colorxy>>24) & 0xFF;
- if ($minalpha!==127) {
- $alpha=127+127*$pct*($alpha-127)/(127-$minalpha);
- }
- else {
- $alpha+=127*$pct;
- }
- $alphacolorxy=ImageColorAllocateAlpha($watermark,
- ($colorxy>>16) & 0xFF, ($colorxy>>8) & 0xFF,
- $colorxy & 0xFF, $alpha);
- if (!ImageSetPixel($watermark,$x,$y,$alphacolorxy)) {
- return false;
- }
- }
- }
- ImageCopy($dst_im, $watermark, $dst_x, $dst_y,
- $src_x, $src_y, $src_w, $src_h);
- }
Вспомогательные изображения
Перед созданием коллажа надо поместить исходные изображения в папку \thumbs, которая должна быть рядом со скриптом генерации. Важно, чтобы соотношение сторон изображений было 4:3, иначе они будут искажаться при наложении. Количество изображений может быть любым, но желательно не менее 9. Изображения для создания коллажа будут каждый раз выбираться случайным образом.
Code (PHP) : Убрать нумерацию
- //-----------------------------------------------------------------------
- // Скрипт для генерации эффектных коллажей
- //-----------------------------------------------------------------------
- // Координаты для базовой привязки элементов коллажа
- $places=array(
- array(25,25), array(75,25), array(125,25),
- array(25,85), array(75,85), array(125,85),
- array(25,145), array(75,145), array(125,145)
- );
- // Получить список исходных изображений в каталоге
- $img=array();
- $dir=opendir('thumbs');
- while ($tmp=readdir($dir)) {
- if (substr($tmp,0,1)=='.') { continue; }
- $img[]=$tmp;
- }
- // Перемешать список
- shuffle($img);
- // Фон с заливкой белым цветом
- $im=ImageCreateTrueColor(256, 256);
- $white=ImageColorAllocate($im, 255, 255, 255);
- ImageFilledRectangle($im, 0, 0, 256, 256, $white);
- // Наложить фоновый блок с тенью
- $background=@ImageCreateFromPng('background.png');
- ImageCopyMergeAlpha($im, $background, 0, 0, 0, 0, 256, 256, 100);
- ImageDestroy($background);
- // Наложить 9 случайных изображений
- for ($i=0; $i<9; $i++) {
- // Количество превьюшек меньше 9
- if ($i==count($img)) { break; }
- // Выбрать незанятое место
- while (true) {
- $pos=mt_rand(0,8);
- if ($places[$pos][0]!=0) { break; }
- }
- $dx=$places[$pos][0];
- $dy=$places[$pos][1];
- // Отметить место как занятое
- $places[$pos]=array(0,0);
- // Сдвиг открытки по осям
- $zx=mt_rand(0,10);
- $zy=mt_rand(0,10);
- $px=(mt_rand(0,100)<50)?($dx+$zx):($dx-$zx);
- $py=(mt_rand(0,100)<50)?($dy+$zy):($dy-$zy);
- // Наложить фон с полупрозрачной тенью
- $shadow=@ImageCreateFromPng('shadow.png');
- ImageCopyMergeAlpha($im, $shadow, $px, $py, 0, 0, 106, 81, 60);
- ImageDestroy($shadow);
- // Наложить изображение
- $thumbnail=@ImageCreateFromJPEG('thumbs/'.$img[$i]);
- ImageCopyResampled($im, $thumbnail, ($px+1), ($py+1),
- 0, 0, 100, 75, 200, 150);
- ImageDestroy($thumbnail);
- }
- header('Content-Type: image/png');
- // Сохранить полученный коллаж в файл и вывести в браузер
- ImagePNG($im,'out.png');
- ImagePNG($im);
- ImageDestroy($im);
В приложении скрипт со всеми вспомогательными изображениями и несколькими фотографиями для демонстрации создания коллажа.
Просмотров: 8807 | Комментариев: 11
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(06.10.2016 в 10:54):
Ну а ошибки я телепатией должен выяснять? Файлы должен через хрустальный шар смотреть? Если нужен нормальный ответ, то сперва надо задать нормальный вопрос.
Alex
(06.10.2016 в 10:40):
Я надеялся что доктор это вы, и что сможете подсказать как адаптировать ваш код под .png. Если заменить $thumbnail=@ImageCreateFromJPEG(); на ImageCreateFromPng все равно идет ошибка
ManHunter
(05.10.2016 в 20:50):
К доктору сходить, сейчас все лечат, даже .png
Alex
(05.10.2016 в 19:46):
Подскажите а как быть если у меня .png
ManHunter
(29.07.2015 в 20:35):
Нет слов........
Herber
(29.07.2015 в 17:08):
ManHunter, я сконвертировал ваш код в c#. С php особо не дружу. Запустил в xampp ваш скрипт - прозрачный фон. Все гут. У меня же черная рамка появляется. Поэтому я спрашивал где в коде конкретно идет заливка?
ManHunter
(29.07.2015 в 15:43):
Прозрачная тень и рамка задается в PNG-файле с альфа-каналом, а не в коде.
Herber
(29.07.2015 в 15:11):
Добрый день. У меня почему то получаются черные границы вокруг картинок. http://joxi.ru/DmBXJzptq719AP. В каком куске кода можно посмотреть цвет границ?
ManHunter
(03.02.2015 в 17:06):
Я тоже на firefox сижу, все прекрасно отображает.
привет
(03.02.2015 в 17:03):
firefox не отображает файл preview.php
... что делать?
... что делать?
lutskboy
(17.11.2014 в 17:01):
очень классно. мне понравилось
Добавить комментарий
Заполните форму для добавления комментария