Php 水印png持续显示当前URL
我正在编写一个脚本,在用户上传的图像上添加水印。因为每个用户都希望自己的图片上有自己的用户名,所以我决定先用用户名制作一个透明的PNG。之后,我使用一种简单的水印技术将PNG和上传的文件合并在一起 我让脚本工作,但每次创建PNG时它都会显示我的当前地址 这是迄今为止的代码:Php 水印png持续显示当前URL,php,gd,Php,Gd,我正在编写一个脚本,在用户上传的图像上添加水印。因为每个用户都希望自己的图片上有自己的用户名,所以我决定先用用户名制作一个透明的PNG。之后,我使用一种简单的水印技术将PNG和上传的文件合并在一起 我让脚本工作,但每次创建PNG时它都会显示我的当前地址 这是迄今为止的代码: <?php session_start(); $username = $_SESSION['login']; $filename = "watermarks/$username.png";
<?php
session_start();
$username = $_SESSION['login'];
$filename = "watermarks/$username.png";
if (file_exists($filename)) {
exit;
} elseif ($filename == "undefined") {
exit;
}else{
header("Content-type: image/png"); //Picture Format
header("Expires: Mon, 01 Jul 2003 00:00:00 GMT"); // Past date
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // Consitnuously modified
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Pragma: no-cache"); // NO CACHE
/*image generation code*/
//create Image of size 350px x 75px
$bg = imagecreatetruecolor(500, 100);
//This will make it transparent
imagesavealpha($bg, true);
$trans_colour = imagecolorallocatealpha($bg, 0, 0, 0, 127);
imagefill($bg, 0, 0, $trans_colour);
//Text to be written
$text = $username;
// White text
$white = imagecolorallocate($bg, 255, 255, 255);
// Grey Text
$grey = imagecolorallocate($bg, 128, 128, 128);
// Black Text
$black = imagecolorallocate($bg, 0,0,0);
$font = 'fonts/LiberationSans.ttf'; //path to font you want to use
$fontsize = 20; //size of font
//Writes text to the image using fonts using FreeType 2
imagettftext($bg, $fontsize, 0, 125, 50, $black, $font, $text);
imagettftext($bg, $fontsize, 0, 127, 52, $white, $font, $text);
//Create image
header( "Content-type: image/png" );
//imagepng($bg);
$save = $filename;
imagepng($bg, $save, 0, NULL);
//destroy image
imagedestroy($bg);
}
?>
我肯定我错过了什么,但我不知道是什么
我的第二个问题是,我不知道如何使文本居中,并消除文本周围的空白。
请下载图片来了解我的意思
提前感谢您的帮助。您没有输出图像。当标题指示图像时,大多数浏览器只显示当前url,但不发送数据 注意您是如何为
imagepng()
提供文件名的?如果您阅读了上面的PHP手册,它会在没有要保存的文件名时输出图像,或者将图像保存到指定的文件名
您需要删除$bg
之后的所有参数以输出图像,或者删除imagedestroy($bg)之后的所有参数
您需要在$save
处打开输出文件并重新输出
类似于以下内容的内容将文件流式传输到输出:
<?php
$fp = fopen($save, 'r');
while(!feof($fp)) {
print fread($fp, 1024);
ob_flush();
flush();
}
fclose($fp);
您没有输出图像。当标题指示图像时,大多数浏览器只显示当前url,但不发送数据
注意您是如何为imagepng()
提供文件名的?如果您阅读了上面的PHP手册,它会在没有要保存的文件名时输出图像,或者将图像保存到指定的文件名
您需要删除$bg
之后的所有参数以输出图像,或者删除imagedestroy($bg)之后的所有参数
您需要在$save
处打开输出文件并重新输出
类似于以下内容的内容将文件流式传输到输出:
<?php
$fp = fopen($save, 'r');
while(!feof($fp)) {
print fread($fp, 1024);
ob_flush();
flush();
}
fclose($fp);
imagecopy($image,$watermark,($w/2)-($ww/2)),$h-$wh,0,0,$ww,$wh)
用于使水印居中
参考此
imagecopy($image,$watermark,($w/2)-($ww/2)),$h-$wh,0,0,$ww,$wh)
用于使水印居中
参考此
您确定要删除不正确的图像吗?我看到脚本只是在现有图像上退出,而且不正确的图像可能在缓存中。对于居中,您需要使用imagettfbbox获取文本的尺寸,并使用这些值确定位置。。(图像的1/2宽度)-(文本的1/2宽度)=图像上文本的起始位置。确实要删除错误的图像吗?我看到脚本只是在现有图像上退出,而且不正确的图像可能在缓存中。对于居中,您需要使用imagettfbbox获取文本的尺寸,并使用这些值确定位置。。(1/2图像宽度)-(1/2文本宽度)=文本在图像上的起始位置。imagepng($bg,NULL)
也将具有与imagepng($bg)
相同的效果,因此通过使用NULL
而不是文件名,您还可以使用其他参数(压缩和过滤器)。谢谢大家的帮助。我需要在不向用户显示的情况下将图像保存在后台。我想我会给他看画廊页面上的水印,问题就解决了。再次感谢imagepng($bg,NULL)
也将具有与imagepng($bg)
相同的效果,因此通过使用NULL
而不是文件名,您还可以使用其他参数(压缩和过滤器)。谢谢大家的帮助。我需要在不向用户显示的情况下将图像保存在后台。我想我会给他看画廊页面上的水印,问题就解决了。再次感谢!