如何在整个图像的对角位置放置水印文本?
How to put a watermark text across the whole image in diagonal position?
我已将我的 Google 驱动器连接到我的网站,我正在获取以下格式的图像:https://googledrive.com/host/{$GoogleID}
。我想要做的是为我从 Google Drive 获得的所有图像添加一个文本(不是图像)水印。我已经尝试过:
- http://php.net/manual/en/image.examples.merged-watermark.php
- http://phpimageworkshop.com/tutorial/1/adding-watermark.html
他们两个都没有为我工作,或者我无法让他们工作我不知道为什么。我将举一个图像示例 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 你可以使用 imagecreatefromjpeg 或 imagecreatefrompng.所以它应该是这样的 $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)。
我已将我的 Google 驱动器连接到我的网站,我正在获取以下格式的图像:https://googledrive.com/host/{$GoogleID}
。我想要做的是为我从 Google Drive 获得的所有图像添加一个文本(不是图像)水印。我已经尝试过:
- http://php.net/manual/en/image.examples.merged-watermark.php
- http://phpimageworkshop.com/tutorial/1/adding-watermark.html
他们两个都没有为我工作,或者我无法让他们工作我不知道为什么。我将举一个图像示例 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 你可以使用 imagecreatefromjpeg 或 imagecreatefrompng.所以它应该是这样的 $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)。