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

StackOverflow https://stackoverflow.com/questions/2070603

  •  20-09-2019
  •  | 
  •  

Вопрос

Можно ли воссоздать изображения из двоичных данных (обработать их, если это необходимо) и отображать их, все в одном сценарии? Что-то типа

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

Этот пример прямо из Страница Википедии по данным 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" />

Другие советы

Это на самом деле возможно с использованием встроенных изображений (называется данные 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'>";

РЕДАКТИРОВАТЬ: Извините, я пропустил уведомление о том, что не желает внешнего сценария, но это решение более эффективно, чем кодирование изображения в 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;

Вы не должны забывать заголовок длины содержимого, в противном случае он не сработает. Вы также можете заменить mime_content_type (), поскольку он устарел в соответствии с документами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top