php: воссоздайте и отобразите изображение от двоичных данных

Действительно ли возможно воссоздать изображения от двоичных данных (обработайте их в случае необходимости), и отобразите их, все в том же сценарии? Что-то как

// 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...

Я не хочу хранить изображения к к диску после обработки и получения их оттуда или использования внешнего сценария...

32
задан Cambiata 15 January 2010 в 09:44
поделиться

3 ответа

Это фактически возможно с использованием встроенных изображений (называемых 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% к их размеру .

Если вы говорите о разумном высоком трафике, общедоступном сайте, я бы рекомендовал вам хранить ваши изображения внешне и кэшировать их. Если это просто для небольшого проекта, встроенные изображения могут работать для вас.

-121--2081151-

Это можно сделать с помощью URI данных в атрибуте image src .

Формат: данные: [<тип ПАНТОМИМЫ>] [; кодировка = «<кодирующий>»] [; base64], <данные>

Этот пример прямой от страница Википедии на данных URIs :

<?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" />
60
ответ дан 27 November 2019 в 20:00
поделиться

Другие возможности для вас - создать сценарий, создающий данные изображения на выход и направьте ссылку на него.

Image.php

$imagedata1 = file_get_contents('assets/test.png');
$imagedata1 = process_using_gd_or_something($imagedata1);

header('Content-type: image/png');
echo $imagedata1;

ord_pages.php:

echo "<img src='image.php?some_params'>";

Редактировать: Извините, я пропустил уведомление о том, чтобы не хотеть внешний скрипт, но это решение более эффективно, чем кодирование изображения в Base64.

3
ответ дан 27 November 2019 в 20:00
поделиться

Это на самом деле возможно, используя встроенные изображения (называемые 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% до их размера .

Если вы говорите о разумном сведении с высоким трафиком, общедоступным сайтом, я бы порекомендовал сохранить свой образ внешности и кэшировать их. Если это просто для небольшого проекта, встроенные изображения могут работать для вас.

22
ответ дан 27 November 2019 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: