Как динамически создать изображение с указанным номером на нем? - PullRequest
4 голосов
/ 16 января 2009

У меня есть изображение заполнителя, говорящее что-то вроде:

Your rating is:
   [rating here]

Мой PHP-код должен динамически вставлять номер рейтинга, где для изображения-заполнителя оставлено пустое место. Как я могу это сделать?

Ответы [ 5 ]

8 голосов
/ 16 января 2009

Вот пример того, как вы могли бы это сделать - используйте функцию gd вызовов, чтобы создать свое изображение, но играйте хорошо и сохраняйте изображения в кэше. Этот образец воспроизводит еще лучше , гарантируя, что, если в браузере уже есть необходимое изображение, он возвращает 304 ...

#here's where we'll store the cached images
$cachedir=$_SERVER['DOCUMENT_ROOT'].'/imgcache/'

#get the score and sanitize it
$score=$_GET['score'];
if (preg_match('/^[0-9]\.[0-9]{1,2}$/', $score)
{
    #figure out filename of cached file
    $file=$cachedir.'score'.$score.'gif';   

    #regenerate cached image
    if (!file_exists($file))
    {
        #generate image - this is lifted straight from the php
        #manual, you'll need to work out how to make your
        #image, but this will get you started

        #load a background image
        $im     = imagecreatefrompng("images/button1.png");

        #allocate color for the text
        $orange = imagecolorallocate($im, 220, 210, 60);

        #attempt to centralise the text  
        $px     = (imagesx($im) - 7.5 * strlen($score)) / 2;
        imagestring($im, 3, $px, 9, $score, $orange);

        #save to cache
        imagegif($im, $file);
        imagedestroy($im);
    }

    #return image to browser, but return a 304 if they already have it
    $mtime=filemtime($file);

    $headers = apache_request_headers(); 
    if (isset($headers['If-Modified-Since']) && 
        (strtotime($headers['If-Modified-Since']) >= $mtime)) 
    {
        // Client's cache IS current, so we just respond '304 Not Modified'.
        header('Last-Modified: '.gmdate('D, d M Y H:i:s', $mtime).' GMT', true, 304);
        exit;
    }


    header('Content-Type:image/gif');
    header('Content-Length: '.filesize($file));
    header('Last-Modified: '.gmdate('D, d M Y H:i:s', $mtime).' GMT');
    readfile($file);


}
else
{
    header("HTTP/1.0 401 Invalid score requested");
}

Если вы поместите это в image.php, вы будете использовать следующее в теге image

<img src="image.php?score=5.5" alt="5.5" />
2 голосов
/ 16 января 2009

Используйте статические изображения в диапазоне от 0 до 9 и просто объедините их на странице, чтобы построить большие числа:

Your Rating: [image1.jpg][image2.jpg][image3.jpg]

1 голос
/ 16 января 2009

Я знаю, что вопрос «Как динамически создать изображение с указанным номером на нем?» но вместо этого я решу основную проблему. Динамические манипуляции с изображениями сильно загружают процессор. Просто не делай этого. И, конечно же, не делайте этого в контексте веб-запроса. Попробуйте вместо этого использовать статические изображения, а затем отобразите правильные в зависимости от рейтинга. Даже если ваша рейтинговая система доходит до 100, было бы лучше иметь 100 статических изображений, чем постоянно перерисовывать одно и то же изображение.

0 голосов
/ 16 января 2009

Почему бы не установить число в виде текста в элементе div, а затем использовать стиль шрифта и фона?

0 голосов
/ 16 января 2009

Также см. Пример альфа-смешивания на http://ca3.php.net/manual/en/function.imagecopymerge.php#73477

Вместо использования imagestring () для записи со встроенными или TTF-шрифтами, Вы можете создавать свои собственные 0-9 символов в виде 24-битных изображений PNG с альфа-смешивание, затем объедините их с помощью imagecopymerge (). Это немного больше работы, но даст вам гораздо больший контроль над внешний вид набора символов.

...