Как стать автором
Обновить

Комментарии 62

А где примеры работы?
Конечный результат работы функции показали бы…
А результат работы скрипта можно увидеть? Или он 100% повторяет предложенный вариант?
Да, действительно, прошу прощения, обновил пост.
Отлично! А реально сделать что бы фоновое изображение было в градиенте, а не в виде размытого изображения и с рваными краями? Как то так:

Эх мечты мечты…
Более чем реально, попробую сделать позже. Этот способ изначально задумывался чтобы подогнать все изображения под один размер, а с рваными краями размер получается визуально неоднозначным.
На белом смотрится отвратительно. Это же эмбилайт, он для темноты!
Так это же интернет. Здесь основной фон белый! К примеру добавить мини зум при наведении мыши и будет небольшой эффект движения. Да и я не дизайнер, я просто предложил.
А может быть опционально еще фоновое изображение в градиенте до окружающего картинку фона?
case 3: // PNG
        $src_image = imagecreatefromjpeg($image_from);
        break;
разве не imagecreatefrompng должно быть?
Спасибо, поправил.
// деление на ноль - плохая идея
    if ( ($src_width ==  0) or ($src_height ==  0) ) {
        return FALSE;
    } 
в правилах хорошего тона выполнять проверку входных данных до совершения с ними операций, я бы советовал перенести этот кусок ближе к началу функции.
За скрипт спасибо, может где пригодится. Выглядит правда необычно, особенно вторая пара локтей на третьем примере :)
попытка хорошая, но далека от ambilight
Попробуйте imageCopyResampled — картинки сглаженные будут.
Действительно лучше, обновил пост.
по центру фото нечего так вышло. а вот у девушки слева грудь задвоилась, а у той что справа локти… надо иначе алгоритм прорабатывать.
Да я вот сделал, а теперь уже и сам думаю, что переработаю немного иначе алгоритм. Вы правы, две — это самое лучшее количество грудей. =)
Это у вас дома кошки нет :)
По-моему, вы как-то неправильно используете своих кошек.
Ну у них сисек больше, и они тоже любимые )
попробуйте сделать это с использованием imagemagick
просто чудесно :)
А почему вместо 'case 2: // JPG' не использовать стандартные константы IMAGETYPE_XXX? По-моему, будет намного читабельнее…
Я не знал о существовании этих констант, спасибо, обновил еще разок.
лучше не размытый увеличенный фон, а лучевое рассеяние точек периметра
Только лучше брать не точки периметра (будут страшные чёткие лучи), а среднее арифметическое, скажем, 50 крайних точек + заблюрить.
Сделал еще один вариант вашим способом.
Решил попробовать скрипт — картинка размером 400х214 (82кб) рендерилась 2 секунды с копейками. Может действительно Imagick?
Сделал ради интереса на основе Imagick, с разными эффектами для заднего фона(просто размытие, направленное размытие, эффект негативной пленки). Параметр spread создает эффект водяной поверхности.
Картинка размером 1024х768(204кб) рендерится примерно 0.25 сек.

Copy Source | Copy HTML
  1. function render($fromImg, $toImg, $width = 200, $height = 200, $typeBlur = "blur", $blur = 20, $spread =  0, $border = 20)
  2. {
  3.     $Image = new Imagick($fromImg);
  4.     $BackGround = $Image->getImage();
  5.     /*уменьшаем картинку на заданную ширину и высоту*/
  6.     $BackGround->scaleImage($width, $height);
  7.  
  8.     /*выбор типа фильтра для размытия*/
  9.     switch ($typeBlur) {
  10.         case "gaussian":
  11.             $BackGround->gaussianBlurImage(5, $blur);
  12.             break;
  13.         case "motion":
  14.             $BackGround->motionBlurImage($blur, 10, 1);
  15.             break;
  16.         case "negate":
  17.             $BackGround->negateImage(false);
  18.             $BackGround->blurImage(5, $blur);
  19.             break;
  20.         default:
  21.             $BackGround->blurImage(5, $blur);
  22.             break;
  23.     }
  24.  
  25.     $widthImage = $Image->getImageWidth();
  26.     $heightImage = $Image->getImageHeight();
  27.  
  28.     if ($widthImage > $heightImage) {
  29.         $Image->scaleImage($width - $border,  0);
  30.         $top = ($height - $Image->getImageHeight()) / 2;
  31.         $left = $border / 2;
  32.     } else {
  33.         $Image->scaleImage( 0, $height - $border);
  34.         $top = $border / 2;
  35.         $left = ($width - $Image->getImageWidth()) / 2;
  36.     }
  37.  
  38.     /*эффект водянной поверхности(если значение больше 0)*/
  39.     if ($spread >  0) $BackGround->spreadImage($spread);
  40.  
  41.     /*объединяем фон и картинку*/
  42.     $BackGround->compositeImage($Image, Imagick::COMPOSITE_OVER, $left, $top);
  43.     /*сохраняем картинку*/
  44.     file_put_contents($toImg, $BackGround->getImageBlob());
  45. }
  46.  
  47. render("image.jpg", "image-mini.jpg");
посмотрел на примеры изображений, почувствовал, как будто укурился
амбилайтом, простите, тут и не пахнет…
да и вообще, вся фишка амбилайта в динамике.
на статических картинках — никак…
никто и не пытается сделать из браузера 40-дюймовый телевизор
НЛО прилетело и опубликовало эту надпись здесь
отличный эффект!
Вау, нравится Ваша идея, надо попробовать реализовать на JS…
Девушка на фотках так себе…
НЛО прилетело и опубликовало эту надпись здесь
Ну, не симпатичная нисколечко, что-ж поделаешь…
[ TROLL DETECTED ]
или ахтунг :)
// деление на ноль — плохая идея
я бы поставил это в самое начало кода, ибо все сейчас проделанное до этого куска не имеет значения, потому что все равно FALSE будет, если w=0 или h=0
Эмбилайт не может «светить» черным, он лампа :)
Большое спасибо за алгоритм и, собственно, идею. Буду переводить на perl несколько позже. =)
Казалось бы, причем здесь Амбилайт? Вы бы хотя бы перед тем как продукт плейсмент устраивать, для начала изучили что есть Амбилайт и как он работает. Там суть в крайних пикселях, а не как тут — картинку увеличили, разблюрили и типа всё, Амбилайт.

Против скрипта ничего не имею, хоть он и бестолковый. Плохо, что зачем-то ни к селу ни к городу начали амбилайт вспоминать.
Спасибо! Прикольный эффект. Буду юзать. :)
Столько работы, ради эффекта усугубляющего вид картинки…
На белом это не смотрится, это же эмбилайт, он для темноты.
Афтар молодец. Интересный код.Авось пригодится.
в идеале должно быть написано на джаваскрипте, использовать только крайние пиксели и работать на черном фоне) если не будет тормозить — будет конфетка.
мне кажется такое лучше делать с помощью js.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Дайте код полной странички, ибо у меня что то не выходит в $image_from даю имя картинки в $image_to даю имя выходной картинки, ошибок не дает, картинку не сохраняет, ЧЯДНТ?

dumpz.org/19143/ — сорцы
Что функция возвращает, true или false? На сервере установлена GD для PHP? Сейчас с телефона пишу, если не разберётесь, то позже пришлю.
Слегка ступил по утру =)
Выдает ошибку на: $result = imagefilter($dest_image, IMG_FILTER_SMOOTH, 6);

Fatal error: Call to undefined function imagefilter() in /var/www/***/1.php on line 59

Note: This function is only available if PHP is compiled with the bundled version of the GD library.
выход ставить bundled version или mgccl.com/2007/03/02/imagefilter-function-for-php-user-without-bundled-gd
Картинки с результатами работы не доступны, помёрли.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации