如何在整个图像的对角位置放置水印文本?

How to put a watermark text across the whole image in diagonal position?

我已将我的 Google 驱动器连接到我的网站,我正在获取以下格式的图像:https://googledrive.com/host/{$GoogleID}。我想要做的是为我从 Google Drive 获得的所有图像添加一个文本(不是图像)水印。我已经尝试过:

他们两个都没有为我工作,或者我无法让他们工作我不知道为什么。我将举一个图像示例 url: https://googledrive.com/host/0B9eVkF94eohMRlBQVENRWE5mc2c

我也试过这个 answer 中的代码,但它也不起作用。我想问题应该是我从 Google 驱动器获取的文件没有文件扩展名,这可能会导致问题。这只是我的猜测...

更新: 我设法在网站上显示了照片,但是如何像这样将所有照片的文本置于对角线位置

尝试使用 file_get_contents 或 fopen 读取图像并从字符串创建图像。

$im = imagecreatefromstring(file_get_contents("image url"));

然后用这个例子:http://php.net/manual/en/image.examples.merged-watermark.php

感谢@Durim Jusaj 帮助我解决这个问题,经过大量搜索和处理大量问题后我终于得到了答案,我将与你们分享我的知识。所以我将 post 代码,我将解释代码的作用。

第一件事。在您的文件中包含此函数。这个函数是寻找图像的中心。我还没有写它,我在评论下的 php 文档中找到了它,所以也许没有它也可以完成,或者可以修改此功能以使其更好地编写。

function imagettftext_cr(&$im, $size, $angle, $x, $y, $color, $fontfile, $text)
{
    // retrieve boundingbox
    $bbox = imagettfbbox($size, $angle, $fontfile, $text);

    // calculate deviation
    $dx = ($bbox[2]-$bbox[0])/2.0 - ($bbox[2]-$bbox[4])/2.0;         // deviation left-right
    $dy = ($bbox[3]-$bbox[1])/2.0 + ($bbox[7]-$bbox[1])/2.0;        // deviation top-bottom

    // new pivotpoint
    $px = $x-$dx;
    $py = $y-$dy;

    return imagettftext($im, $size, $angle, $px, $py, $color, $fontfile, $text);
}

加载要应用水印的图像。我正在使用 Google 驱动器来提取我的照片,所以这就是为什么我使用 file_get_contents,如果你和我一样,那么使用这个,但否则使用常见的,如果你的图片有扩展名.jpg.png 你可以使用 imagecreatefromjpegimagecreatefrompng.所以它应该是这样的 $im = imagecreatefromjpeg('photo.jpeg');例如。

$im = imagecreatefromstring(file_get_contents("https://drive.google.com/uc?id=" . $v['GoogleID']));

之后我们需要计算水印的位置,所以我们希望水印在中心,并根据照片的大小自动调整水印的大小。所以首先我们将图像的所有属性存储到数组中。第二行和第三行我们计算图像的中心在哪里(对我来说,将它除以 2.2 效果很好,如果你想调整位置,你可以改变它。最后一行是根据图像大小的水印大小. 这很重要,因为如果你有不同大小的图像,水印会很小或很大。

list($width, $height, $type, $attr) = getimagesize("https://drive.google.com/uc?id=" . $v['GoogleID']);
$width = $width / 2.2;
$height = $height / 2.2;
$size = ($width + $height) / 4;

设置内容类型

header('Content-Type: image/png');

创建图像。我不知道为什么应该做两次,但我正在遵循 php 手册。

$im = imagecreatefromstring(file_get_contents("https://drive.google.com/uc?id=" . $v['GoogleID']));

创建一些颜色。所以,如果你想要你的水印是透明的(像我的一样)你必须使用 imagecolorallocatealpha,否则使用 imagecolorallocate。最后一个参数是透明度。您可以 google 每个函数名称以从 php 文档中获取更多信息。

$black = imagecolorallocatealpha($im, 0, 0, 0, 100);

要绘制的文本。就那么简单。写下您想要的文字。

$text = 'nima.bg';

将路径替换为您自己的字体路径。在您的服务器中放置一个字体,以便代码可以使用它(如果您还没有)。

$font = 'fonts/ParsekCyrillic.ttf';

全部相加。基本上,您是使用此功能创建带有水印的最终图像。魔法 ;)

imagettftext_cr($im, $size, 20, $width, $height, $black, $font, $text);

现在这是棘手的部分!如果您只想显示图像而不将其保存到您的服务器,您只需复制并粘贴此代码, 但是 如果您有超过 2-3 张图片,网站加载速度会很慢。所以,我建议您将最终图像保存到您的服务器然后显示它。我知道你会有重复的,但这是我认为最好的选择。

ob_start();
imagepng($im);
$image = ob_get_contents();
ob_end_clean();
imagedestroy($im);

echo "<img src='data:image/png;base64," . base64_encode($image) . "'>";
}

您可以将图像保存到您的服务器,然后显示它们,速度要快得多。您可以做的最好的事情是处理所有带有水印的图像,然后显示它们(这样您就可以在访问者访问您的网站时显示它们)。

imagepng($im, 'photo_stamp.png');
imagedestroy($im);

我的最终结果就是这样。

更新: 自 2017 年起,您可以使用此 link 'https://drive.google.com/uc?id=(GoogleID)' 提取图像,或者您可以只使用 'webContentLink' Google_DriveFile 对象的 属性(它会给你相同的 link)。