Создание миниатюры изображений, эфект Philips Ambilight
Что и говорить, придумал это не я, но так получилось что пришлось слегка доделать данный метод ибо у меня он не работал. Все основано на PHP функции которую предложил aidsoid с небезызвестного хабра. Данная функция создает миниатюру изображения сохраняя ее пропорции!
Вот эта функция:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | // функция создаёт "миниатюру" изображения сохраняя пропорции // и обрамляет неиспользуемое пространство в стиле Philips Ambilight // Входные параметры: // $image_from - имя файла исходного изображения // $image_to - имя файла результирующего изображения // $width - желаемая ширина результирующей "миниатюры" // $height - желаемая высота результирующей "миниатюры" // $padding - минимальная рамка в пикселях (по умолчанию = 5) // $dest_image_type - тип изображения для сохранения (по умолчанию JPG): // 2 - JPG // 3 - PNG // Возвращает: // TRUE - в случае успеха // FALSE - в случае неудачи function aidsoid_resize_image($image_from, $image_to, $width=200, $height=200, $padding=5, $dest_image_type=2) { $image_vars = getimagesize($image_from); if (!$image_vars) { return FALSE; } $src_width = $image_vars[ 0]; $src_height = $image_vars[1]; $src_type = $image_vars[2]; if (($src_type != IMAGETYPE_JPEG) and ($src_type != IMAGETYPE_PNG)) { return FALSE; } switch ($src_type) { case IMAGETYPE_JPEG: $src_image = imagecreatefromjpeg($image_from); break; case IMAGETYPE_PNG: $src_image = imagecreatefrompng($image_from); break; default: return FALSE; break; } if (!$src_image) return FALSE; // создаем задний фон для нового изображения $dest_image = imagecreatetruecolor($width, $height); // копируем из исходного изображения в фон и растягиваем без соблюдения пропорций $result = imagecopyresized($dest_image, $src_image, 0, 0, 0, 0, $width, $height, $src_width, $src_height); if (!$result) return FALSE; // применяем к фону размытие for ($i= 0; $i<=100; $i++) { $result = imagefilter($dest_image, IMG_FILTER_SMOOTH, 6); if (!$result) return FALSE; } // деление на ноль - плохая идея if ( ($src_width == 0) or ($src_height == 0) ) { return FALSE; } // вычисляем масштабный коэффициент $ratio = min( ($width-2*$padding)/$src_width , ($height-2*$padding)/$src_height ); // вычисляем новые размеры изображения $new_width = $ratio * $src_width; $new_height = $ratio * $src_height; // если новая высота или новая длина больше оригинальных, // то это значит, что изображение будет растянуто, не нужно допускать этого, // в этом случае оставим оригинальное изображение без изменения размеров if ( ($new_width >= $src_width) or ($new_height >= $src_height) ) { $new_width = $src_width; $new_height = $src_height; } // скопируем поверх фона получившееся изображение $result = imagecopyresampled($dest_image, $src_image, round(($width-$new_width)/2), round(($height-$new_height)/2), 0, 0, $new_width, $new_height, $src_width, $src_height); if (!$result) return FALSE; // сохраняем на носитель switch ($dest_image_type) { case IMAGETYPE_JPEG: // качество изображения 100 $result = imagejpeg($dest_image, $image_to, 100); break; case IMAGETYPE_PNG: // максимальный уровень сжатия 9 $result = imagepng($dest_image, $image_to, 9); break; default: return FALSE; break; } if (!$result) return FALSE; chmod($image_to, 0777); return TRUE; } |
А вызываем мы ее вот так:
1 2 | // данная строка делает изображение и сохраняет его на сервер aidsoid_resize_image($image_from, $image_to, 200, 200, 5, 2); |
Самое интересное что она может не сработать по неадекватной как кажется причине: при вызове функции imagefilter библиотеки GD. Пришлось искать решение… Вот что было найдено на просторах интернета: http://mgccl.com/2007/03/02/imagefilter-function-for-php-user-without-bundled-gd . Это очередная PHP функция которая позволяет использовать imagefilter без обращения к GD, ее надо вставить до вызова нашей функции aidsoid_resize_image. Но есть у нее и минусы — она заметно снижает производительность скрипта.
Все это занимает много места, поэтому рекомендую все функции поместить в отдельный файл и просто делать include…
Данной информации, не сомневаюсь, и так достаточно, чтобы сделать вывод, как не надо делать.
[Ответить]
«Спасибо за такой пост»
[Ответить]
Да довольно таки прикольно!
[Ответить]