PHP: воссоздать и отобразить изображение из двоичных данных - PullRequest
31 голосов
/ 15 января 2010

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

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

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

Ответы [ 5 ]

61 голосов
/ 15 января 2010

Это можно сделать с помощью данных 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" />
22 голосов
/ 15 января 2010

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

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

4 голосов
/ 23 сентября 2014

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

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

<img alt="105x105" class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php echo $img ?>"/>
3 голосов
/ 15 января 2010

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

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.

2 голосов
/ 02 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...