Php наложения картинок на

Фотомонтажим на PHP

Возвращаясь к теме работы с изображениями в PHP, рассмотрим реализацию «смешивания» изображения из нескольких картинок, и способы практического применения такого трюка.

Постановка задачи

Итак, постановка задачи: предположим, на вашем сайте имеется галерея, и для навигации по ней вы (естественно) решили прибегнуть с списку thumbnails*, однако дизайн вашего сайта требует, чтобы картинки имели скругленные края, а также вы хотите, чтобы на каждой картинке стоял логотип вашего сайта.

thumbnails* — так принято называть уменьшенные копии изображения, которые применяются для предварительного просмотра в графических программах, файловых менеджерах а также на сайтах галерей. В переводе с английского дословно значит «ноготь большого пальца руки».

Если вы знакомы с основами работы в Photoshop (а скорее всего, так и есть), то делали бы вы это примерно так (см. схему):

* создали бы скруглённые углы
(с цветом фона по краям и прозрачной областью в середине)
* наложили бы полученую «маску» на исходное изображение
* если у вас непостоянный цвет фона на страницах, то вы также скорей всего указали бы цвет маски в индексе прозрачности

Однако, как видим, все эти операции можно отлично автоматизировать. То есть, в конечном итоге, от вас будет только требоваться создать саму исходную картинку. А уменьшение, и все вышеперечисленные работы проделает за вас скрипт, прямо во время обращения пользователя за этой картинкой на сайте. Кроме того, «генерация на лету» даст возможность чрезвычайно просто сменить обрамление всех картинок (например, оставить скругленными только два угла, или просто срезать уголок у картинки) а также поменять «наклееный» логотип, не перерисовывая при этом всех картинок.
Инструментарий

Читайте также:  Windows java jvm path

Теперь давайте выясним, что же есть в PHP для реализации нашего замысла.

Для наложения одного изображения на другое существует функция imagecopy():

imagecopy ( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h );

Здесь, dst_im и src_im — идентификаторы изображений (соответственно, исходного и накладываемого), dstX и dstY — x,y-координаты на исходном изображении, куда будет вставлено накладываемое; srcX и srcY — x,y-координаты, от которых будет отсчитыватся вырезаемая область изображения-источника (размеры этой области задаются параметрами src_w и src_h).

Как видим, эта функция просто переносит изображение (или его часть) на другое изображение. Однако у нас есть также довольно полезная функция, которая делает это с изменением размеров изображения-источника — imagecopyresized(). Вот её общий вид:

imagecopyresized ( resource dst_im, resource src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH );

Все параметры тут аналогичны предыдущей функции, плюс добавилась ещё одна пара чисел — dstW и dstH, которые задают размеры накладываемой области на изображении dst_im.

Также нам понадобится функция работы с прозрачностью изображения — imagecolortransparent (img, color). Она устанавливает указанный цвет, как прозрачный. Здесь всего два параметра: первый — это, как обычно, идентификатор изображения, второй — номер цвета в таблице цветов (как его достать — ниже).

Для большей совместимости мы будем работать с форматом PNG, т. к. формат GIF поддерживается не всеми версиями GD-библиотеки.

Пару слов о форматах. В интернете существует два формата, способных работать с прозрачностью: PNG (в двух стандартах — PNG-8 и PNG-24) и GIF. Исторически сложилось так, что формат GIF стал более популярен, чем его конкурент. Однако, более новый стандарт PNG более приспособлен к размещению изображений в интернете, в особенности — PNG-24, благодаря большей, чем в GIF возможной глубине (теоретически — до 48 бит, против 8) а также благодаря поддержке 8-битного альфа-канала.

(правда, как не обидно, самый популярный браузер Internet Explorer до сих пор (9 лет!) не поддерживает полностью формат PNG-24 (в частости, самую полезную его фичу — альфа-канал). Так что работать придется по старинке — PNG-8 и однобитной прозрачностью.

Как вы помните, идентификатор цвета можно получить несколькими способами. Уже известный вам способ — функция imagecolorallocate (img, a, b, c), которая добавляет в цветовую таблицу изображения img цвет RGB(a,b,c), если его там нет, и возвращает его порядковый номер из этой самой таблицы.

Другой способ получить номер цвета — это функция imagecolorat (img, x, y). Она возвращает номер цвета пикселя с координатами (x;y) (при условии, что изображение с индексироваными цветами, к которым как раз относятся форматы GIF и PNG-8)

Что ж, время переходить к примерам. Рассмотрим небольшой PHP-скрипт:

Источник

Как средствами php наложить одну картинку на другую?

Нужно наложить допустим две картинки 1.png и 2.png, где 2.png заведомо меньше. Наложить то бишь наклеить или сделать слияние, т.е. на выходе должна получиться одна картинка(основа с «наклеенной» на нее другой картинкой). И еще расширение первой картинки может меняться на любое другое графическое

одну картинку наложить на другую
Добрый вечер, в заголовок вставляю картинку с градиентом, и сверху хочу наложить другую с городом.

Наложить одну картинку на другую под определенным углом
задание вроде того, что у фидле. нужно наложить одну картинку на другую, при том, что нижняя.

Можно ли средствами Qt наложить на видео картинку?
Нужно сделать программу, которая накладывает на видео вотермарк (для начала просто картинку) и.

Как сделать кнопку для перехода на другую страницу и что бы я мог на неё картинку наложить
Про href я знаю, а как картинку наложить на кнопку не знаю.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
 $src = imagecreatefromjpeg('http://www.funk.eu/wp-content/uploads/_category_icons/Cat_Small_PHP.jpg'); $main_img = imagecreatefromjpeg('http://graphics8.nytimes.com/images/2008/04/20/magazine/20learn-600.jpg'); $location_x = 10; $location_y = 100; $offset_src_x = 0; $offset_src_y = 5; $src_width = 65; $src_height = 45; $no_transparent = 100; imagecopymerge($main_img, $src, $location_x, $location_y, $offset_src_x, $offset_src_y, $src_width, $src_height, $no_transparent); header('Content-Type: image/gif'); imagegif($main_img); imagedestroy($main_img); imagedestroy($src);

А сохранить прозрачный фон у накладываемой картинки как?

Добавлено через 33 минуты
Все, разобрался. использовал imagecopy. Но что-то качество наложенный картинки хромает.

Добавлено через 32 минуты
Выходит так, что качество конечной картинки автоматически меняется уже после слияния картинок и накладываемая так же меняет качество. Как-то можно сохранить качество накладываемой в конечном результате? А то если на основе особо не видна потеря качества, то на накладываемом изображении прямо таки разница существенна.

ЦитатаСообщение от Sunman Посмотреть сообщение

Выходит так, что качество конечной картинки автоматически меняется уже после слияния картинок и накладываемая так же меняет качество. Как-то можно сохранить качество накладываемой в конечном результате? А то если на основе особо не видна потеря качества, то на накладываемом изображении прямо таки разница существенна.

Лучше использовать вместо imagecopymerge, функцию imagecopyresampled, которая интерполирует значения пикселов без потери качества.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 $src = imagecreatefromjpeg('http://www.funk.eu/wp-content/uploads/_category_icons/Cat_Small_PHP.jpg'); $main_img = imagecreatefromjpeg('http://graphics8.nytimes.com/images/2008/04/20/magazine/20learn-600.jpg'); $w_src = imagesx($src); $h_src = imagesy($src); $w_dest = imagesx($main_img); $h_dest = imagesy($main_img); $transfer_x = 250; $transfer_y = 150; imagecopyresampled($main_img, $src, $transfer_x, $transfer_y, 0, 0, $w_src, $h_src, $w_src, $h_src); header('Content-Type: image/jpeg'); imagejpeg($main_img); imagedestroy($main_img); imagedestroy($src); ?>

ЦитатаСообщение от LASSO Посмотреть сообщение

Лучше использовать вместо imagecopymerge, функцию imagecopyresampled, которая интерполирует значения пикселов без потери качества.

Да в принципе результат получился тот же по качеству. Жаль нельзя наложить одну картинку 100% качества, на другую чуть пожатую. imagecopy если 100 качество задать, то получается конечно качественная картинка, но и объем раза в 3-4 больше(
Порылся в гугле и нашел только способ перегонки уже сформированного 100% изображения в 80%, автор пишет, что у него это работает, а у меня все те же «80%» в итоге, что основного, что накладываемого изображения. На данный момент накладываю с помощью jq, но это изврат ибо иногда скрипт глючит и накладываемая картинка в ауте находится, да и как-то не хочется нагружать скриптами сайт.

Источник

Imagick::compositeImage

Накладывает одно изображение на другое с указанным смещением. Любые дополнительные аргументы, необходимые для алгоритма наложения, следует передавать в setImageArtifact с ‘compose:args’ в качестве первого параметра и данных в качестве второго параметра.

Список параметров

Объект Imagick, содержащий накладываемое изображение.

Смещение столбца накладываемого изображения.

Смещение строки накладываемого изображения.

Укажите любую константу CHANNEL, которая подходит для вашего режима канала. Для применения более чем к одному каналу объедините константы типа CHANNEL с помощью побитовых операторов. Обратитесь к этому списку констант CHANNEL.

Возвращаемые значения

В случае успешной работы возвращает true .

Примеры

Пример #1 Пример использования Imagick::compositeImage() :

Наложение двух изображений с помощью ‘математического’ метода наложения

// Эквивалентно запуску команды
// convert src1.png src2.png -compose mathematics -define compose:args=»1,0,-0.5,0.5″ -composite output.png

$src1 = new \ Imagick ( «./src1.png» );
$src2 = new \ Imagick ( «./src2.png» );

$src1 -> setImageVirtualPixelMethod ( Imagick :: VIRTUALPIXELMETHOD_TRANSPARENT );
$src1 -> setImageArtifact ( ‘compose:args’ , «1,0,-0.5,0.5» );
$src1 -> compositeImage ( $src2 , Imagick :: COMPOSITE_MATHEMATICS , 0 , 0 );
$src1 -> writeImage ( «./output.png» );

Смотрите также

User Contributed Notes 4 notes

Here is an example on how to compose two images into a single one. The Imagick class utilises the exception handling model introduced in PHP5 and thus we will do that as well. Let’s presume, that we have a directory in our filesystem, which contains our program and the two images we want to operate on.

try
<
// Let’s check whether we can perform the magick.
if ( TRUE !== extension_loaded ( ‘imagick’ ))
<
throw new Exception ( ‘Imagick extension is not loaded.’ );
>

// This check is an alternative to the previous one.
// Use the one that suits you better.
if ( TRUE !== class_exists ( ‘Imagick’ ))
<
throw new Exception ( ‘Imagick class does not exist.’ );
>

// Let’s find out where we are.
$dir = dirname ( __FILE__ );

// Let’s read the images.
$glasses = new Imagick ();
if ( FALSE === $glasses -> readImage ( $dir . ‘/glasses.png’ ))
<
throw new Exception ();
>

$face = new Imagick ();
if ( FALSE === $face -> readImage ( $dir . ‘/face.jpg’ ))
<
throw new Exception ();
>

// Let’s put the glasses on (10 pixels from left, 20 pixels from top of face).
$face -> compositeImage ( $glasses , Imagick :: COMPOSITE_DEFAULT , 10 , 20 );

// Let’s merge all layers (it is not mandatory).
$face -> flattenImages ();

// We do not want to overwrite face.jpg.
$face -> setImageFileName ( $dir . ‘/face_and_glasses.jpg’ );

// Let’s write the image.
if ( FALSE == $face -> writeImage ())
<
throw new Exception ();
>
>

catch ( Exception $e )
<
echo ‘Caught exception: ‘ . $e -> getMessage () . «\n» ;
>

exit( 0 );
?>
Also a couple more words on the Imagick::COMPOSITE_DEFAULT argument. The images we are composing together are separate layers. Not only can we put them in specific order, but we can also choose the way we want them to interfere with each other. And here comes the second argument of the compositeImage method. It can be given either as a constant or as the integer value of that constant. You can use the reflection API of PHP5 to get the list of them.

Reflection :: export (new ReflectionClass ( ‘Imagick’ ));
?>

Just look for COMPOSITE_* constants in the «Constants» section.

Источник

Оцените статью