1

我有一个网站,上面有很多原始图片,我希望人们访问该网站以查看原始图片,并且让搜索引擎只显示带有透明水印的图片。

以下是我所说的透明水印的示例。当然,除了我替换“测试!” 与公司名称。

凹凸图

这是我到目前为止创建的 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 库。

4

1 回答 1

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);

输出:

输出

于 2015-07-23T22:21:17.103 回答