Водяной знак через php - PullRequest
       18

Водяной знак через php

0 голосов
/ 28 января 2012

Мой последний вопрос - занят, поэтому я должен открыть новый. (прочитайте мой последний вопрос здесь ). Я пытаюсь перенаправить запрос в файл 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-файл просто отображает alt-тег img-файла и возвращает эту ошибку: 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 ]

7 голосов
/ 28 января 2012

Вы сказали, что: /hotlinking/watermark.php - это ваш путь к файлу, поэтому я думаю, что ваш rewriterule должен быть

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

И я думаю, что у вас возникла ошибка при прямом доступе

http://192.168.1.190/hotlinking/watermark.php

потому что вы, кажется, не передаете параметр pic.

Кстати:

a) Я почти уверен, что вам придется изменить $ _GET ['pic']path или функция imagecreatefromjpeg не сможет открыть ваше изображение.

b) если это не jpeg, вам придется изменить его с помощью другой функции.Вам придется проверить тип изображения перед его открытием.

--- ОБНОВЛЕНИЕ ---

Хорошее значение RewriteRule RewriteRule (.*) watermark.php?pic=$1

Теперь у вас есть водяной знакФайл .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 голос
/ 28 января 2012

На заметку: Вы должны проверить, существует ли изображение, прежде чем выводить изображение, и показать другое изображение, если оно не найдено. например:

<?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"); и затем проверьте, существует ли файл при последующих загрузках страницы, так как это не значительно ускорит ваш сценарий, но удвоит объем используемого дискового пространства.

...