PHP GD Library выводит изображение и текстовое содержимое на одну и ту же страницу - PullRequest
3 голосов
/ 01 декабря 2011

Я пытаюсь вывести изображение в браузер, а затем вывести HTML (не связанный непосредственно с изображением) на той же странице.Это возможно?У меня чертовски много времени, чтобы понять это.Вот мой код, с которым я возился:

<?php
    function LoadJpeg($imgname){
        /* Attempt to open */
        $im = @imagecreatefromjpeg($imgname);
        /* See if it failed */
        if(!$im){
            /* Create a black image */
            $im  = imagecreatetruecolor(150, 30);
            $bgc = imagecolorallocate($im, 255, 255, 255);
            $tc  = imagecolorallocate($im, 0, 0, 0);
            imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
            /* Output an error message */
            imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
        }
        return $im;
    }

    header('Content-Type: image/jpeg');
    $img = LoadJpeg('images/Ball.jpg');
    imagejpeg($img);
    imagedestroy($img);
    //trying to start my text here
    header('Content-Type text/html; charset=utf-8');
    echo "<br /><h2>ross</h2>";
?>

В самом низу моего кода я пытаюсь добавить мой HTML.когда я запускаю его, я получаю только изображение, а потом текст отсутствует.Если я попытаюсь переместить его наверх перед функцией, сразу после открывающего тега php, текст будет работать правильно, а затем я получу сообщение об ошибке:

Предупреждение: невозможно изменить информацию заголовка - заголовки ужеотправлено (вывод начался в /Applications/MAMP/htdocs/newimage.php:4) в /Applications/MAMP/htdocs/newimage.php в строке 28

Любая помощь будет высоко оценена, спасибо.

Ответы [ 4 ]

9 голосов
/ 01 декабря 2011

Остановись и подумай немного. Как бы вы обычно вставляли изображение в файл HTML? Вы создаете два файла: text.html и image.jpg. То же самое здесь, вы создадите два скрипа, один для вывода HTML, а другой для создания изображения. HTML будет выглядеть так:

<img src="generateimage.php" alt="generated image"/>
<br/>
<h2>ross</h2>

Сценарий generateimage.php генерирует только изображение.

Давайте возьмем, например, форму, которая позволяет пользователю создать цифровую рождественскую открытку: он может выбрать изображение и написать под ним личную заметку.

form.html:

<html><body>
<form action="view_card.php" method="post">
    Select an image:
    <select name="imgname">
        <option value="tree">Picture of Christmas tree</option>
        <option value="santa">Picture of Santa</option>
    </select><br/>

    Write a message:
    <textarea name="message"></textarea>
    <br/>

    <input type="submit" value="View Christmas card"/>
</form>
</body></html>

view_card.php:

<html><body>
Here is your Christmas card:
<hr/>

<!-- sending the requested image to the generateimage.php script
     as a GET parameter -->
<img src="generateimage.php?imgname=<?php echo(urlencode($_POST['imgname'])); ?>"/>
<?php echo(htmlspecialchars($_POST['message'])); ?>
</body></html>

generateimage.php:

<?php
/* Stop evil hackers from accessing files they are not supposed to */
$allowed_files = array('tree' => 'tree.jpg', 'santa' => 'santa.jpg');
if( !isset($allowed_files[$_GET['imgname']]) {
    exit; // Thank you for playing...
}

/* Attempt to open */
$im = @imagecreatefromjpeg($allowed_files[$_GET['imgname']]);

/* See if it failed */
if(!$im){
    /* Create a black image */
    $im  = imagecreatetruecolor(150, 30);
    $bgc = imagecolorallocate($im, 255, 255, 255);
    $tc  = imagecolorallocate($im, 0, 0, 0);
    imagefilledrectangle($im, 0, 0, 150, 30, $bgc);

    /* Output an error message */
    imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
}

header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
?>
8 голосов
/ 01 декабря 2011

Включение изображения в HTML

См. Следующий вопрос и ответы: Изображение кодировки Base64 .

Вы должны можете кодировать свое изображение, используя base64_encode(), а затем вывести его в теге <img>, например:

<img src="data:image/x-icon;base64,<?php echo base64_encode($img); ?>"></img>

(см. это jsfiddle для доказательства).

Генерация изображения в другом файле

Вы можете генерировать изображение вне скрипта, генерирующего HTML. В таком случае вам нужно будет сгенерировать здесь HTML и установить атрибут src тега <img> в местоположение скрипта, генерирующего изображение. См. Ответ @ Родена для более подробного ответа относительно этого решения.

Это сработало? Вам нужна дополнительная помощь?

1 голос
/ 01 декабря 2011

Вы не можете установить заголовок после отправки вывода в браузер.Вместо этого отправьте все как text / html и вставьте необработанные данные изображения в тег img

<?php


function LoadJpeg($imgname)
{
/* Attempt to open */
$im = @imagecreatefromjpeg($imgname);

/* See if it failed */
if(!$im)
{
    /* Create a black image */
    $im  = imagecreatetruecolor(150, 30);
    $bgc = imagecolorallocate($im, 255, 255, 255);
    $tc  = imagecolorallocate($im, 0, 0, 0);

    imagefilledrectangle($im, 0, 0, 150, 30, $bgc);

    /* Output an error message */
    imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
}

  // Changed the following line to return the output 
  // of imagejpeg() instead of the image object
  return imagejpeg($im);
}

$img = LoadJpeg('images/Ball.jpg');

//trying to start my text here
header('Content-Type text/html; charset=utf-8');

// img tag with image raw data set as source
echo '<img src="data:image/jpeg;base64,'.base64_encode($img).'" alt="photo">';

echo "<br /><h2>ross</h2>";


?>
0 голосов
/ 01 декабря 2011

Храните только свой код создания изображения в своем собственном PHP-скрипте.Затем вы вызываете скрипт в своем HTML, как если бы это было обычное изображение с тегом img, например:

<img src="jpegscript.php" alt="image"/>
...