Водяной знак png продолжает показывать текущий URL - PullRequest
0 голосов
/ 03 ноября 2010

Я работаю над сценарием для нанесения водяных знаков на изображения, загруженные пользователями.Поскольку каждый пользователь хочет, чтобы на его изображении было его собственное имя, я решил сначала создать прозрачный 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);

    }
    ?>

Я уверен, что что-то пропустил, но не могу понять, что.

Моя вторая проблема заключается в том, что я не могу понять, какчтобы получить текст в центре и избавиться от пустого пространства вокруг текста.alt text

Пожалуйста, загрузите изображение, чтобы понять, что я имею в виду.

Заранее спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 03 ноября 2010

Вы не выводите изображение. Большинство браузеров просто отображают текущий URL, когда заголовки указывают изображение, но данные не отправляются.

Обратите внимание, как вы указываете имя файла для imagepng()? Если вы прочитали руководство по PHP на imagepng(), там написано, что либо выведет изображение, если отсутствует имя файла для сохранения, ИЛИ сохраните изображение указанное имя файла.

Вам нужно либо удалить все аргументы после $bg для вывода изображения, либо после imagedestroy($bg); вам нужно открыть выходной файл на $save и заново вывести его.

Что-то вроде следующего будет передавать файл на выход:

<?php
$fp = fopen($save, 'r');
while(!feof($fp)) {
    print fread($fp, 1024);
    ob_flush();
    flush();
}
fclose($fp);
1 голос
/ 03 ноября 2010
// Merge watermark upon the original image

imagecopy ($ image, $ watermark, (($ w / 2) - ($ ww / 2)), $ h- $ wh, 0, 0, $ ww, $ wh);

Для центрирования водяного знака

см. Это

http://www.nzwhost.com/article/simple-php-watermark

...