Статьи

Изображение водяных знаков с Imagick

Представьте, что однажды ваш друг подошел к вам и хотел бы, чтобы вы создали для нее веб-сайт, чтобы она могла продемонстрировать свои фотографии. Она хочет иметь возможность легко загружать свои фотографии и наносить на них водяные знаки, чтобы люди не могли их легко украсть. «Не волнуйтесь!» — говорите вы ей, потому что знаете, что есть расширение , предоставляемое расширением Imagick, которое делает изображения водяных знаков легкими в PHP.

В этой статье дается несколько советов о том, что делает эффективный водяной знак, а затем показано, как использовать функции Imagick для добавления водяного знака на изображение. Прежде чем начать, убедитесь, что расширение Imagick доступно на вашем хосте. Также желательно найти несколько фотографий, на которых вы можете проверить водяной знак, чтобы оценить его эффективность.

Что делает хороший водяной знак

Чтобы водяной знак был эффективным, он должен быть видимым на самых разных фонах. Я предлагаю вам попытаться найти хотя бы одну тестовую фотографию, которая будет очень светлой, и другую, которая будет очень темной. Например, эти две фотографии прерий из Shutterstock составляют хорошую пару тестов:

2 prairie dog pictures

Важно, чтобы водяной знак был достаточно прозрачным, чтобы вы могли видеть исходное изображение, но достаточно непрозрачным, чтобы недобросовестному человеку было трудно его удалить. Уровень непрозрачности 40%, вероятно, является хорошей отправной точкой, и вы можете увеличить или уменьшить его в зависимости от ситуации.

Вы также хотите, чтобы водяной знак был достаточно большим. Если вы просто поместите небольшой водяной знак в нижнем правом углу, это будет основной целью для обрезки. Водяные знаки, которые покрывают большую часть исходного изображения, более эффективны. Посмотрите, как iStockPhoto и Shutterstock помечают свои работы водяными знаками для примера.

Наконец, водяной знак должен иметь контраст. Попробуйте сделать темный водяной знак легким штрихом или наоборот. Это то, что делают iStockPhoto и Shutterstock, и их отметка легко видна на всех их изображениях, независимо от того, является ли исходное изображение светлым или темным.

В этой статье я буду использовать это в качестве водяного знака, PNG-файл с непрозрачностью около 40%:

watermark

Добавление водяного знака

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

<?php // Open the original image $image = new Imagick(); $image->readImage("/path/to/image.jpg"); // Open the watermark $watermark = new Imagick(); $watermark->readImage("/path/to/watermark.png"); // Overlay the watermark on the original image $image->compositeImage($watermark, imagick::COMPOSITE_OVER, 0, 0); // send the result to the browser header("Content-Type: image/" . $image->getImageFormat()); echo $image; 

Вы можете открыть изображения из пути, создав новый экземпляр класса Imagick и используя его readImage() . Хорошая особенность Imagick в том, что он может в любое время открывать файл, поддерживаемый ImageMagick, поэтому вам не нужно явно указывать ему, что это файл JPEG или PNG; он достаточно умен, чтобы понять это самостоятельно.

Чтобы наложить изображение водяного знака, вы используете метод compositeImage() . В этом примере метод принимает четыре параметра: первый — это изображение, которое будет наложено, второй — предопределенная константа, представляющая, какой тип операции компоновки должен выполнить Imagick (есть целый набор вариантов для достижения различных эффектов), и третий и четвертый параметры — это координаты X и Y, в которые помещается водяной знак, измеренный в пикселях от верхнего левого угла.

По умолчанию PHP предполагает вывод вашего скрипта в формате HTML и автоматически отправляет текстовый / html заголовок Content-Type. Если вы выводите изображение, браузер не будет обрабатывать его должным образом, так как заголовки сообщают, что вы отправляете текст. Чтобы ваши посетители не встречали страницу с фальшивкой, вы должны указать PHP отправлять более подходящий заголовок с помощью header() перед отправкой изображения. Вместо простого кодирования значения заголовка Content-Type, этот пример получает доступ к типу изображения, используя сам Imagick, который затем используется для создания соответствующего типа MIME на лету.

Вот конечный результат, изображение с водяным знаком:

Масштабирование водяного знака

Предыдущий пример разместил водяной знак в верхнем левом углу исходного изображения. Хотя этот подход подходит, если вы заранее знаете размер исходных изображений, поскольку вы можете создать водяной знак с соответствующими размерами, вам может потребоваться более надежный подход в случае, если размеры исходных изображений различаются. Такой подход может заключаться в размещении водяного знака в центре изображения и масштабировании водяного знака заранее, если он больше исходного изображения.

 <?php $image = new Imagick(); $image->readImage("/path/to/image.jpg"); $watermark = new Imagick(); $watermark->readImage("/path/to/watermark.png"); // how big are the images? $iWidth = $image->getImageWidth(); $iHeight = $image->getImageHeight(); $wWidth = $watermark->getImageWidth(); $wHeight = $watermark->getImageHeight(); if ($iHeight < $wHeight || $iWidth < $wWidth) { // resize the watermark $watermark->scaleImage($iWidth, $iHeight); // get new size $wWidth = $watermark->getImageWidth(); $wHeight = $watermark->getImageHeight(); } // calculate the position $x = ($iWidth - $wWidth) / 2; $y = ($iHeight - $wHeight) / 2; $image->compositeImage($watermark, imagick::COMPOSITE_OVER, $x, $y); header("Content-Type: image/" . $image->getImageFormat()); echo $image; 

Методы getImageWidth() и getImageHeight() возвращают ширину и высоту изображения соответственно, измеренные в пикселях. Сравнивая ширину и высоту изображения водяного знака с изображениями исходного изображения, вы можете определить, нужно ли изменять размер водяного знака, чтобы он соответствовал меньшим изображениям.

Изменение размера водяного знака осуществляется путем вызова scaleImage() который принимает допустимые ширину и высоту. Метод уменьшит изображение так, чтобы максимальная ширина не превышала допустимую ширину, а максимальная высота не превышала допустимую высоту, сохраняя при этом соотношение сторон изображения.

И вот изображение с водяным знаком, которое получается из этого примера:

another watermarked prairie dog image

Резюме

Библиотека Imagick предоставляет комплексный API для обработки изображений. Действительно, вы видели, как легко открывать файлы изображений, определять их размеры и формат изображения, масштабировать их и накладывать один поверх другого, чтобы пометить их водяными знаками.

Обычно я предлагаю документацию на php.net, если вы хотите узнать больше о возможностях расширения, но в случае с Imagick документация не совсем точная. Многие методы имеют только свой список параметров. Так что если вы хотите узнать больше, php.net все еще является хорошим местом для начала, но вам, возможно, придется поискать дополнительную информацию о методах в какой-то другой форме (например, приложение командной строки) на самом сайте ImageMagick и в Google. ,