Сгенерировать изображения с помощью ImageMagick без сохранения в файл, но все же отображать их на веб-сайте

Это мой код ImageMagick, который отлично работает на моем веб-сервере, создав новое изображение с именем файла «coloured_font.png» в каталоге по умолчанию …

<?php $cmd = " -background none -pointsize 60 -font Times-Roman -fill red ". " -strokewidth 1 -stroke black label:\"google\" "; exec("convert $cmd coloured_font.png"); ?> 

Но теперь я запускаю ImageMagick в Windows, который не будет создавать файлы изображений в папке по умолчанию, но приложения ImageMagick работают нормально (я протестировал, создав миниатюру). Итак, теперь моя идея – показать «coloured_font.png» на экране браузера, не сохраняя его нигде … поэтому, пожалуйста, кто-нибудь может помочь мне создать и отобразить изображение на экране, не сохраняя его.

Вы можете использовать специальный inline: формат изображений (который ImageMagick поддерживает также для чтения файлов). Этот формат является базовым кодированием двоичных данных.

В командной строке (Linux):

 my_base64_png="$( convert \ -background none \ -pointsize 60 \ -font Times-Roman \ -fill red \ -strokewidth 1 \ -stroke black \ label:\"google\" \ png:fd:1 \ | \ base64 -i - -o -)" 

Эта команда использует несколько специальных трюков ImageMagick и оболочка в рукавах:

  • используя формат hint png: сказать, что вывод должен быть в формате PNG;
  • используя stdout в качестве своего выходного канала (вместо файла) путем указания fd:1 ;
  • контактирование вывода непосредственно в stdin двоичного кода base64 для кодирования PNG;
  • сохраняя данные в кодировке base64 в переменной среды my_base64_png .

Теперь в вашем HTML вставляем данные изображения base64 (которые должны работать во всех современных, но не работают в старых браузерах ):

  <IMG SRC="data:image/png;base64, echo "$(my_base64_png)" ALT="google" WIDTH=214 HEIGHT=57 VSPACE=5 HSPACE=5 BORDER=0 /> 

или

  <IMG SRC="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAM4AAABJAQMAAABPZIvnAAAABGdBTUEAALGPC/xh BQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAA OpgAABdwnLpRPAAAAAZQTFRFAAAA/wAAG/+NIgAAAAF0Uk5TAEDm2GYAAAABYktH RACIBR1IAAAACXBIWXMAAABIAAAASABGyWs+AAAB6ElEQVQ4y+3UQY7bIBQG4IeQ yqYaLhANV+iyi9FwpS69iGyiLuZYpepF6A1YskC8/uCA7SgZtVI3lcoiivkIxu/9 MdH/8U+N6el2pk0oFyibWyr1Q3+PlO2NqJV+/BnRPMjcJ9zrfJ/U+zQ9oAvo+QGF d+npPqFQn++TXElkrEpEJhAtlTBR6dNHUuzIMhFnEhxAmJDkKxlmt7ATXDDJYcaE r4Txqtkl42VYSH+t9KrD9b5nxZeog/LWGVHprGInGWVQUTvjDWXca5KdsowqyGSc DrZRlGlQUl4kQwpUjiSS9gI9VdECZhHFQ2I+UE2CHJQfkNxTNKCl0RkURqlLowJK 1h1p3sjc0CJD39D4BIqD7JvvpH/GAxl2/YSq9mtHSHknga7OKNOHKyEdaFC2Dh1w 9VSJemBeGuHgMuh24EynK03YM1Lr83OjUle38aVSfTblT424rl4LhdglsUag5RB5 uBJSJBIiELSzaAeIN0pUlEeZEMeClC4cBuH6mxOlgPjC3uLproUCWfy58WPN/MZR 86ghc888yNdD0Tj8eAucasl2I5LqX19I7EmEjaYjSb9R/G1SYfQA7ZBuT5H6WwDt UAfK1BOJmh/eZnKLeKvZ/vA8qonCpj1h6djfbqvW620Tva36++MXUkNDlFREMVkA AAAldEVYdGRhdGU6Y3JlYXRlADIwMTItMDgtMjJUMDg6Mzc6NDUrMDI6MDBTUnmt AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEyLTA4LTIyVDA4OjM3OjQ1KzAyOjAwIg/B EQAAAA50RVh0bGFiZWwAImdvb2dsZSJdcbX4AAAAAElFTkSuQmCC" ALT="google" WIDTH=214 HEIGHT=57 VSPACE=5 HSPACE=5 BORDER=0 /> 

Вам не составит труда перевести эту процедуру на PHP. 😉

Как я уже сказал, ImageMagick может прочитать этот inline: формат inline: (не используется здесь для чтения). Но для полноты позвольте мне показать вам, как:

  convert \ 'inline:image/png;data:, iVBORw0KGgoAAAANSUhEUgAAAM4AAABJAQMAAABPZIvnAAAABGdBTUEAALGPC/xh BQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAA OpgAABdwnLpRPAAAAAZQTFRFAAAA/wAAG/+NIgAAAAF0Uk5TAEDm2GYAAAABYktH RACIBR1IAAAACXBIWXMAAABIAAAASABGyWs+AAAB6ElEQVQ4y+3UQY7bIBQG4IeQ yqYaLhANV+iyi9FwpS69iGyiLuZYpepF6A1YskC8/uCA7SgZtVI3lcoiivkIxu/9 MdH/8U+N6el2pk0oFyibWyr1Q3+PlO2NqJV+/BnRPMjcJ9zrfJ/U+zQ9oAvo+QGF d+npPqFQn++TXElkrEpEJhAtlTBR6dNHUuzIMhFnEhxAmJDkKxlmt7ATXDDJYcaE r4Txqtkl42VYSH+t9KrD9b5nxZeog/LWGVHprGInGWVQUTvjDWXca5KdsowqyGSc DrZRlGlQUl4kQwpUjiSS9gI9VdECZhHFQ2I+UE2CHJQfkNxTNKCl0RkURqlLowJK 1h1p3sjc0CJD39D4BIqD7JvvpH/GAxl2/YSq9mtHSHknga7OKNOHKyEdaFC2Dh1w 9VSJemBeGuHgMuh24EynK03YM1Lr83OjUle38aVSfTblT424rl4LhdglsUag5RB5 uBJSJBIiELSzaAeIN0pUlEeZEMeClC4cBuH6mxOlgPjC3uLproUCWfy58WPN/MZR 86ghc888yNdD0Tj8eAucasl2I5LqX19I7EmEjaYjSb9R/G1SYfQA7ZBuT5H6WwDt UAfK1BOJmh/eZnKLeKvZ/vA8qonCpj1h6djfbqvW620Tva36++MXUkNDlFREMVkA AAAldEVYdGRhdGU6Y3JlYXRlADIwMTItMDgtMjJUMDg6Mzc6NDUrMDI6MDBTUnmt AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEyLTA4LTIyVDA4OjM3OjQ1KzAyOjAwIg/B EQAAAA50RVh0bGFiZWwAImdvb2dsZSJdcbX4AAAAAElFTkSuQmCC' \ my_decoded.png 

ImageMagick не требует image/png; часть команды (она даже игнорирует ее), поскольку она может идентифицировать формат в любом случае через собственную встроенную магическую базу данных, но это не повредит …

Позвольте мне также указать, что длина командной строки ImageMagick ограничена 5000 символами, поэтому чтение inline: данные не будут работать для больших изображений. (В настоящий момент я не знаю, какое ограничение для вложения данных изображения в HTML …)

Просто замените coloured_font.png на coloured_font.php в html-файле и создайте

coloured_font.php с этим содержимым:

 <?php header("Content-Type: image/png"); echo `convert -background none -pointsize 60 -font Times-Roman -fill red ". " -strokewidth 1 -stroke black label:\"google\" png:-`; 

вот и все! Попробуйте открыть coloured_font.php в своем браузере!

Вам придется создать временный файл

меры

  1. Создайте временный файл temp_image.jpg , запустив команду temp_image.jpg в оболочке
  2. Отправить это как ответ http

     $file = 'pathto/temp_image.jpg'; $type = 'image/jpeg'; // set appropriate type header('Content-Type:'.$type); // set content type header('Content-Length: ' . filesize($file)); readfile($file); 
  3. Удалить temp_image.jpg

Предположим, что это в getImage.php , его можно указать как источник тега изображения

 <img src="pathto/getImage.php" />