Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Вы можете сделать это, используя URI данных в атрибуте src.

Формат: data:[<MIME-type>][;charset="<encoding>"][;base64],<data>

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

Ответ 2

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

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

Ответ 3

Попробуйте это...

$img=base64_encode($row['PICTURE']);

<img alt="105x105" class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php echo $img ?>"/>

Ответ 4

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

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: К сожалению, я пропустил уведомление о нежелании внешнего script, но это решение более эффективно, чем кодирование изображения на base64.

Ответ 5

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

Ответ 6

Я хочу отобразить изображение из базы данных MSSQL SERVER с помощью php,

Изображение хранится в базе данных в двоичном виде.