Возможно ли воссоздать изображения из двоичных данных (обрабатывать их при необходимости) и отображать их, все в одном скрипте? Что-то вроде
// get and display image 1: $imagedata1 = file_get_contents('assets/test.png'); $imagedata1 = process_using_gd_or_something($imagedata1); echo "<img src={$imagedata1} >"; // <-- IS THIS (OR EQUIVALENT) POSSIBLE? // get and display image 2: //etc...
Я хочу избежать хранения изображений на диск после обработки и получения их оттуда или с помощью внешнего скрипта …
Вы можете сделать это, используя URI данных в атрибуте src
изображения.
Формат: data:[<MIME-type>][;charset="<encoding>"][;base64],<data>
Этот пример прямо со страницы Википедии по URI данных :
<?php function data_uri($file, $mime) { $contents = file_get_contents($file); $base64 = base64_encode($contents); return ('data:' . $mime . ';base64,' . $base64); } ?> <img src="<?php echo data_uri('elephant.png','image/png'); ?>" alt="An elephant" />
Это действительно возможно с использованием встроенных изображений (называемых URI данных ).
Тэг изображения будет выглядеть примерно так:
<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/ /ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcpp V0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7" width="16" height="14" alt="embedded folder icon">
Почему в основном это не очень хорошая идея:
Загрузка страницы будет замедляться, потому что изображение должно быть загружено до того, как полная структура HTML может быть загружена и, таким образом, отображена. Тем более, если вы выполняете дополнительные операции над изображением. Вероятно, ваш сайт будет намного медленнее, чем если бы это был внешний образ.
Встроенные изображения должны быть закодированы в base64, добавив 33% к их размеру .
Если вы говорите о разумном высоком трафике, общедоступном сайте, я бы рекомендовал вам хранить ваше изображение внешне и кэшировать их. Если это только для небольшого проекта, встроенные изображения могут работать для вас.
Попробуй это…
$img=base64_encode($row['PICTURE']); <img alt="105x105" class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php echo $img ?>"/>
Другая возможность для вас – создать скрипт, создающий данные изображения, на выход и направлять ссылку на него.
image.php
$imagedata1 = file_get_contents('assets/test.png'); $imagedata1 = process_using_gd_or_something($imagedata1); header('Content-type: image/png'); echo $imagedata1;
other_pages.php:
echo "<img src='image.php?some_params'>";
EDIT: К сожалению, я пропустил уведомление о нежелании внешнего скрипта, но это решение более эффективно, чем кодирование изображения на base64.
Если вы просто хотите изображение, без каких-либо html вокруг него, вы можете использовать следующее:
$filename = 'assets/test.png'; $original_image = file_get_contents($filename); $processed_image = process_the_image_somehow($original_image); header('Content-type: '.mime_content_type($filename)); header('Content-Length: '.strlen($processed_image)); echo $processed_image;
Вы не должны забывать заголовок Content-Length, иначе он не будет работать. Вы также можете заменить mime_content_type (), поскольку он устарел в соответствии с документами.