水印通过PHP

时间:2012-01-28 11:46:51

标签: php image .htaccess watermark

我的最后一个问题是忙,所以我必须开一个新的。 (阅读我的上一个问题here)。 我试图将请求重定向到watermark.php文件,以便在从我网站外部调用的图像中嵌入徽标。但是当我将此代码用于htaccess文件时:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} .*jpg$|.*gif$|.*png$ [NC]
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !localhost [NC] 
RewriteCond %{HTTP_REFERER} !friendlysite\.com [NC]  
RewriteCond %{HTTP_REFERER} !google\. [NC] 
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]

RewriteRule (.*) /watermark.php?pic=$1

和watermark.php的这些:

<?php
// Load the stamp and the photo to apply the watermark to
$stamp = imagecreatefrompng('tbwm.png');
$im = imagecreatefromjpeg($_GET['pic']);

// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);

// Copy the stamp image onto our photo using the margin offsets and the photo 
// width to calculate positioning of the stamp. 
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

// Output and free memory
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>

php文件只显示img文件的alt标记并返回此错误: The requested URL /watermark.php was not found on this server.当我直接打开watermark.php时,此错误返回: The image http://192.168.1.190/hotlinking/watermark.php cont not be displayed because it contains errors.

问题是什么?

2 个答案:

答案 0 :(得分:7)

你说过:/hotlinking/watermark.php是你的文件路径,所以我认为你的重写必须是

RewriteRule (.*) /hotlinking/watermark.php?pic=$1

我认为您在直接访问

时出错
http://192.168.1.190/hotlinking/watermark.php

因为您似乎没有传递pic参数。

顺便说一下:

a)我很确定你必须修改$ _GET ['pic']路径,否则函数imagecreatefromjpeg将无法打开你的图片。

b)如果它不是jpeg,你将不得不用另一个函数修改它。在打开之前,您必须检查图像类型。

---更新---

好的RewriteRule是RewriteRule (.*) watermark.php?pic=$1

现在您已经请求了watermark.php文件。 您必须修改您的代码。 $ _GET ['pic']告诉你请求了什么图像路径。您必须修改此路径才能打开图像。

Watermark.php在根目录中,所以也许只有dirname(__FILE__) . $_GET['pic']会这样做。

    <?php
// Load the stamp and the photo to apply the watermark to
$filepath = dirname(__FILE__) . $_GET['pic'];
if ( file_exists($filepath) ) 
{

    $infos = pathinfo($filepath);
    $im = null;
    switch($infos['extension']) 
    {
        case 'jpg' :
        case 'jpeg' :
            $im = imagecreatefromjpeg($filepath);
            break,
        case 'png' : 
            $im = imagecreatefrompng($filepath);

        // ....
    }

    if ( $im !== null )
    {
        $stamp = imagecreatefrompng('tbwm.png');
        // Set the margins for the stamp and get the height/width of the stamp image
        $marge_right = 10;
        $marge_bottom = 10;
        $sx = imagesx($stamp);
        $sy = imagesy($stamp);

        // Copy the stamp image onto our photo using the margin offsets and the photo 
        // width to calculate positioning of the stamp. 
        imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

        // Output and free memory
        header('Content-type: image/png');
        imagepng($im);
        imagedestroy($im);
    }
}

这不是完整的脚本,只是如何开始。你必须自己弄清楚其余部分。

答案 1 :(得分:1)

旁注: 您需要在输出图像之前检查图像是否存在,如果未找到则显示不同的图像。 e.g:

<?php
$pathToImage='./images/'.basename($_GET['pic']);

if(file_exists($pathToImage)==true){
    // Load the stamp and the photo to apply the watermark to
    $stamp = imagecreatefrompng('tbwm.png');
    $im = imagecreatefromjpeg($pathToImage);

    // Set the margins for the stamp and get the height/width of the stamp image
    $marge_right = 10;
    $marge_bottom = 10;
    $sx = imagesx($stamp);
    $sy = imagesy($stamp);

    // Copy the stamp image onto our photo using the margin offsets and the photo
    // width to calculate positioning of the stamp.
    imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

    // Output and free memory
    header('Content-type: image/png');
    imagepng($im);
    imagedestroy($im);
}else{
    header('Content-type: image/png');
    readfile('notfound.png');
}
?>

回复评论:

您可以通过向imagepng添加文件名来缓存图像($ im,“new_image.png”);然后检查文件是否存在于后续页面加载中,这样就不会大大加快脚本速度,但会使用的磁盘空间增加一倍。