Détection du type d'image à partir de la chaîne base64 en PHP

est-il possible de trouver le type d'une image encodée comme une chaîne base64 en PHP?

Je n'ai pas de méthode pour accéder au fichier image original, juste la chaîne encodée. De ce que j'ai vu, imagecreatefromstring() peut créer une ressource image à partir d'une représentation string (après avoir été décodé à partir de base64), mais détecte automatiquement le type d'image et la ressource image elle-même est une représentation PHP spéciale. Dans le cas où je veux sauver l'image comme un fichier à nouveau, je n'aurais aucune idée si le type que je sauvegarde correspond au type original à partir duquel la représentation String a été créée.

39
demandé sur Epicurus 2011-05-19 20:03:37

5 réponses

FileInfo peut le faire pour vous:

$encoded_string = "....";
$imgdata = base64_decode($encoded_string);

$f = finfo_open();

$mime_type = finfo_buffer($f, $imgdata, FILEINFO_MIME_TYPE);
83
répondu Marc B 2011-05-19 16:12:12

Si vous ne voulez pas utiliser ces fonctions en raison de leurs dépendances, vous pouvez utiliser les premiers octets de données:

function getBytesFromHexString($hexdata)
{
  for($count = 0; $count < strlen($hexdata); $count+=2)
    $bytes[] = chr(hexdec(substr($hexdata, $count, 2)));

  return implode($bytes);
}

function getImageMimeType($imagedata)
{
  $imagemimetypes = array( 
    "jpeg" => "FFD8", 
    "png" => "89504E470D0A1A0A", 
    "gif" => "474946",
    "bmp" => "424D", 
    "tiff" => "4949",
    "tiff" => "4D4D"
  );

  foreach ($imagemimetypes as $mime => $hexbytes)
  {
    $bytes = getBytesFromHexString($hexbytes);
    if (substr($imagedata, 0, strlen($bytes)) == $bytes)
      return $mime;
  }

  return NULL;
}

$encoded_string = "....";
$imgdata = base64_decode($encoded_string);
$mimetype = getImageMimeType($imgdata);
33
répondu Aaron Murgatroyd 2012-03-27 23:20:17

la solution donnée par @Marc B est la meilleure pour moi (si notre version php est > 5.3.0 sinon nous pouvons utiliser la solution donnée par @Aaron Murgatroyd).

je voudrais donner un petit plus à cette solution.

Pour obtenir le type d'image que vous pouvez le faire comme ceci :

$split = explode( '/', $mime_type );
$type = $split[1]; 

en fait, (si vous ne le savez pas) le type mime pour les images est: image / type et tapez peut être png ou gif ou jpeg ou ...

j'Espère que peut aider quelqu'un et merci à @Marc B pour sa solution.

pour une liste exhaustive des types mime, Vous pouvez regarder ici:

6
répondu youssman 2014-09-01 21:42:01

le chemin montré par @Marc B est le plus beau.

Devrait FInfo ne pas être disponible, le seul moyen que je connaisse est de stocker les données dans un fichier, et lancez un getimagesize().

3
répondu Pekka 웃 2011-05-19 16:13:33

si vous connaissez une quantité minimale sur la structure de format de fichier, vous pourriez théoriquement regarder les octets supérieurs du fichier jusqu'à ce que vous pourriez travailler sur quel type de fichier il s'agit.

Par exemple, une image GIF commence toujours avec les octets suivants GIF89a. Si vous pouvez trouver cette chaîne au début du fichier, vous pouvez être raisonnablement sûr que c'est une image GIF et absolument certaine, il n'est pas tout autre format d'image. (il pourrait encore être un fichier texte si, qui arrive juste à démarrer avec "GIF89a'; vous auriez à analyser plus du fichier pour être absolument certain)

de même, les fichiers PNG ont la chaîne PNG assez proche du début (ce n'est pas tout à fait au début; encore une fois, vous aurez besoin de rechercher les détails du format de fichier pour vous aider à déterminer ce que vous avez besoin de savoir pour être certain).

JPEGs contiennent également des chaînes reconnaissables dans leurs en-têtes, bien que celles-ci soient plus variées et complexes. Vous voudrez peut-être regarder pour la chaîne Exif.

obtenir les définitions de format de fichier vous donnerait certainement plus de précision, mais en fonction de la précision dont vous avez besoin pour être, vous pourriez en savoir assez sur les formats de fichiers juste en ouvrant des fichiers image dans un éditeur binaire pour voir comment ils sont structurés.

Ces ressources peuvent aider vous:

2
répondu Spudley 2011-05-19 16:28:59