Библиотека PHP GD выводит изображение и текстовое содержимое на одной странице

Я пытаюсь вывести изображение в браузер, а затем вывести 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

Любая помощь будет очень признательна, спасибо.

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

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

Сценарий generateimage.php 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); ?> 

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

См. Следующие вопросы и ответы: Base64 Encoding Image .

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

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

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

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

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

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

вы не можете установить заголовок, как только вывод был отправлен в браузер. Вместо этого отправьте все как 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>"; ?> 

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

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