我正在编写一个脚本,将水印放在用户上传的图像上。因为每个用户都希望在他的图片上有自己的用户名,所以我决定先用用户名创建一个透明的PNG。之后,我使用简单的水印技术将PNG和上传的文件合并在一起。
我让脚本正常工作,但每次创建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);
}
?>
我确定我错过了什么,但我无法弄清楚是什么。
我的第二个问题是我无法弄清楚如何将文本放到中心并摆脱文本周围的空白区域。
请下载图片,看看我的意思。
提前感谢您的帮助。
答案 0 :(得分:3)
您没有输出图像。大多数浏览器只会在标题指示图像时显示当前网址,但不会发送任何数据。
注意你是如何为imagepng()
提供文件名的?如果您阅读imagepng()
上的PHP手册,它表示如果没有要保存的文件名,它将 输出图像, OR 将图像保存到文件名指定。
您需要删除$bg
之后的所有参数才能输出图像,或者在imagedestroy($bg);
之后需要在$save
打开输出文件并重新输出。
以下内容会将文件流式传输到输出:
<?php
$fp = fopen($save, 'r');
while(!feof($fp)) {
print fread($fp, 1024);
ob_flush();
flush();
}
fclose($fp);
答案 1 :(得分:1)
// Merge watermark upon the original image
imagecopy($ image,$ watermark,(($ w / 2) - ($ ww / 2)),$ h- $ wh,0,0,$ ww,$ wh);
用于居中水印
参考此