php: créer et afficher une image à partir de données binaires

est-il possible de recréer des images à partir de données binaires (les traiter si nécessaire) et de les afficher, le tout dans le même script? Quelque chose comme

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

je veux éviter de stocker les images sur le disque après le traitement et de les obtenir à partir de là, ou en utilisant un script externe...

29
demandé sur Cambiata 2010-01-15 12:44:17

5 réponses

vous pouvez faire cela en utilisant un URI des données dans l'image src l'attribut.

Le format est: data:[<MIME-type>][;charset="<encoding>"][;base64],<data>

cet exemple vient tout droit de page de Wikipédia sur les données 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" />
59
répondu Ben James 2010-01-15 09:47:55

Ceci est en fait possible en utilisant des images inline (appelées URI des données s).

Ta balise image devrait ressembler à quelque chose comme ceci:

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

Pourquoi elles ne sont généralement pas une bonne idée:

  • chargement de la Page sera ralenti parce que l'image doit être récupérée avant la structure HTML complète peut être chargée et donc rendue. Encore plus si vous effectuez des les opérations sur l'image. Votre site se sentira très probablement beaucoup plus lent que s'il s'agissait d'une image externe.

  • Inline images doivent être encodées en base64, ajouter 33% à leur taille.

si vous parlez d'un site public à fort trafic raisonnable, je vous recommande de stocker votre image à l'extérieur, et de la mettre en cache. Si c'est juste pour un petit projet, les images en ligne peut travailler pour vous.

22
répondu Pekka 웃 2010-01-15 10:00:07

Essayez ceci...

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

<img alt="105x105" class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php echo $img ?>"/>
4
répondu erdemildiz 2014-09-23 13:43:19

autre possibilité pour vous est de créer un script produisant les données de l'image à la sortie et diriger le lien vers elle.

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'>";

modifier: Désolé, j'ai raté l'avis de ne pas vouloir de script externe, mais cette solution est plus efficace que l'encodage de l'image à base64.

3
répondu Krab 2010-01-15 10:09:42

Dans le cas où vous voulez juste l'image, sans html autour d'elle, vous pouvez utiliser la syntaxe suivante:

$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;

Vous ne devez pas oublier L'en-tête Content-Length, sinon ça ne marchera pas. Vous pouvez également remplacer mime_content_type (), car il est obsolète selon les docs.

1
répondu riyad 2011-07-02 00:36:03