web-dev-qa-db-fra.com

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, toutes 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 les avoir traitées et récupérées à partir de là, ou utiliser un script externe ...

31
Cambiata

Vous pouvez le faire en utilisant un URI de données dans l'attribut image src.

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

Cet exemple provient directement de la page Wikipedia sur les URI de données :

<?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" />
61
Ben James

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

Votre balise d'image ressemblerait à 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 ils ne sont généralement pas une bonne idée:

  • Le chargement de la page sera ralenti car l'image doit être récupérée avant la structure HTML complète peut être chargée et donc , rendu. Encore plus si vous effectuez des opérations supplémentaires sur l'image. Votre site se sentira très probablement beaucoup plus lentement que s'il s'agissait d'une image externe.

  • Les images en ligne doivent être encodées en base64, ajoutant 33% à leur taille .

Si vous parlez d'un site public à fort trafic et raisonnable, je vous recommande de stocker votre image en externe et de les mettre en cache. Si c'est juste pour un petit projet, les images en ligne peuvent fonctionner pour vous.

22
Pekka 웃

Essaye ça...

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

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

Une autre possibilité pour vous est de créer un script produisant les données d'image vers la sortie et de diriger le lien vers celle-ci.

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: Désolé, j'ai raté l'avis de ne pas vouloir un script externe, mais cette solution est plus efficace que le codage de l'image en base64.

3
Krab

Dans le cas où vous voulez juste l'image, sans html autour d'elle, vous pouvez utiliser ce qui suit:

$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 cela ne fonctionnera pas. Vous pouvez également remplacer mime_content_type () car il est obsolète selon les documents.

2
riyad