image — Попытка сгенерировать трехмерный текст рельефной карты в переполнении стека

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

Ниже приведен пример того, что я имею в виду под прозрачным водяным знаком. За исключением, конечно, я заменяю «Тест!» с названием компании.

BumpMap

Вот код 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.

1

Решение

Я бы рекомендовал использовать полупрозрачный 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);

Выход:

Выход

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]