У меня есть веб-сайт, который я монетизирую, с многочисленными оригинальными картинками на нем, я хочу, чтобы люди заходили на веб-сайт, чтобы увидеть оригинальные картинки, и поисковые системы показывали только картинки с прозрачными водяными знаками.
Ниже приведен пример того, что я имею в виду под прозрачным водяным знаком. За исключением, конечно, я заменяю «Тест!» с названием компании.
Вот код PHP, который я создал до сих пор:
<?php
$txt = "TEST!";
header( "Content-type: image/jpeg", true );
$w = imagefontwidth(5) * ( strlen( $txt ) + 1 );
$h = imagefontheight(5) * 2;
$i2 = imagecreatetruecolor( $w,$h );
imagesavealpha( $i2, true );
imagealphablending( $i2, false );
imagefill( $i2, 0, 0, imagecolorallocatealpha( $i2, 255, 255, 255, 127 ) );
imagestring( $i2, 3, 10, 10, $txt, imagecolorallocate( $i2, 255, 0, 0) );
$i = imagecreatefromjpeg( "someimage.jpg" );
imagecopyresized( $i, $i2, 2, 2, 0, 0, $w * 5, $h * 7, $w, $h );
imagejpeg( $i, null, 100 );
imagedestroy( $i );
imagedestroy( $i2 );
?>
$i2
переменная ресурса для поля изображения, в которое я добавил текст, и $i1
для большого изображения для размещения текста. $w
а также $h
представляют ширину и высоту текстового поля изображения. Этот код может создавать текст поверх изображения без отображения фона, но он не создает эффекта рельефной карты, как показано на рисунке выше.
Кто-нибудь может подсказать мне, какие функции, математику или код мне нужно использовать для создания эффекта рельефной карты?
Я чувствую, что мое решение требует специальных манипуляций с блоком пикселей, но я не знаю, как это сделать для этого эффекта.
Я также хочу придерживаться библиотеки PHP GD Image.
Я бы рекомендовал использовать полупрозрачный PNG и добавить его в качестве водяной знак вместо того, чтобы использовать imagestring
функции.
С imagestring
функциям, которые вам теоретически необходимы для создания двух строк, одна чуть выше и слева от другой, а затем каким-то образом вычислить пиксели, в которых присутствуют обе строки, и сделать их прозрачными. Это будет означать, что оставшиеся части будут черно-белыми и дадут тот эффект 3d.
Пример 1
Если водяной знак одинаков для каждого изображения, вы можете использовать полупрозрачный PNG. Преимущество этого заключается в том, что он обеспечивает гораздо больше эффектов и, как результат, лучший результат.
<?php
// Watermark will take up 80% of the photo's width
$size = 80;
$im = imagecreatefromjpeg(dirname(__FILE__) . '/photo.jpg');
$oi = imagecreatefrompng(dirname(__FILE__) . '/watermark.png');
$w1 = imagesx($im);
$h1 = imagesy($im);
$w2 = imagesx($oi);
$h2 = imagesy($oi);
$w = $w1 - (($w1 / 100) * (100 - $size));
$h = ($w * $h2) / $w2;
imagecopyresampled($im, $oi, $w1 / 2 - $w / 2, $h1 / 2 - $h / 2, 0, 0, $w, $h, $w2, $h2);
header('Content-type: image/jpg');
imagejpeg($im, null, 100);
imagedestroy($im);
Будет производить следующий вывод:
Оригинальная фотография / водяной знак
Пример 2
Если водяной знак должен быть различным для каждого изображения, вы можете использовать imagettftext создать текст, используя шрифт по вашему выбору (гораздо лучше, чем imagestring но ограничены тем, какие эффекты вы можете сделать).
<?php
$size = 55;
$angle = 15;
$text = uniqid();
$font = 'BebasNeue.otf'; // http://www.dafont.com/bebas-neue.font
$im = imagecreatefromjpeg(dirname(__FILE__) . '/photo.jpg');
$w = imagesx($im);
$h = imagesy($im);
$text_colour_1 = imagecolorallocatealpha($im, 0, 0, 0, 99);
$text_colour_2 = imagecolorallocatealpha($im, 255, 255, 255, 90);
$box = imagettfbbox($size, $angle, dirname(__FILE__) . '/' . $font, $text);
imagettftext($im, $size, $angle, (($w - $box[4]) / 2) - 1, (($h - $box[5]) / 2) - 1, $text_colour_1, dirname(__FILE__).'/' . $font, $text);
imagettftext($im, $size, $angle, ($w - $box[4]) / 2, ($h - $box[5]) / 2, $text_colour_2, dirname(__FILE__).'/' . $font, $text);
header('Content-type: image/jpg');
imagejpeg($im, null, 100);
Выход:
Других решений пока нет …