online example encoded base64_decode php base64 image-formats

example - Detectando el tipo de imagen de la cadena base64 en PHP



encode base 64 string (5)

¿Es posible encontrar el tipo de una imagen codificada como base64 String en PHP?

No tengo ningún método para acceder al archivo de imagen original, solo la cadena codificada. Por lo que he visto, imagecreatefromstring() puede crear un recurso de imagen a partir de una representación de cadena (después de haber sido decodificado desde base64), pero detecta automáticamente el tipo de imagen y el recurso de imagen en sí es una representación especial de PHP. En caso de que quiera guardar la imagen como un archivo nuevamente, no tendría idea si el tipo que estoy guardando corresponde al tipo original desde el cual se creó la representación de Cadena.


La forma mostrada por @Marc B es la mejor.

En caso de que FInfo no esté disponible, la única forma que conozco es almacenar los datos en un archivo y ejecutar getimagesize() en él.


La solución dada por @Marc B es la mejor para mí (si nuestra versión php es> 5.3.0 de lo contrario podemos usar la solución dada por @Aaron Murgatroyd).

Me gustaría dar un pequeño agregado a esta solución.

Para obtener el tipo de imagen, puede hacerlo así:

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

De hecho, (si no lo sabe), el tipo de mimo para las imágenes es: la imagen / tipo y el tipo pueden ser png o gif o jpeg o ...

Espero que pueda ayudar a alguien y gracias a @Marc B por su solución.

Para obtener una lista exhaustiva del tipo de mimo, puede mirar aquí:


Si conoce una cantidad mínima sobre la estructura del formato de archivo, en teoría podría mirar los bytes superiores del archivo hasta que pueda averiguar qué tipo de archivo es.

Por ejemplo, una imagen GIF siempre comienza con los siguientes bytes GIF89a . Si puede encontrar esa cadena al principio del archivo, puede estar razonablemente seguro de que se trata de una imagen GIF y de que no tiene ningún otro formato de imagen. (Sin embargo, todavía podría ser un archivo de texto, que simplemente comienza con ''GIF89a'', tendría que analizar más del archivo para estar absolutamente seguro)

Del mismo modo, los archivos PNG tienen la cadena PNG bastante cerca del inicio (no está del todo al principio, de nuevo, necesitaría investigar los detalles del formato del archivo para ayudarlo a determinar cuánto necesita saber para estar seguro).

Los archivos JPEG también contienen cadenas reconocibles en sus encabezados, aunque estos son más variados y complejos. Es posible que desee buscar la cadena Exif .

Obtener las definiciones de formato de archivo definitivamente le daría más precisión, pero dependiendo de qué tan precisa sea su necesidad, puede aprender lo suficiente acerca de los formatos de archivos simplemente abriendo algunos archivos de imagen en un editor binario para ver cómo están estructurados.

Estos recursos pueden ayudarlo a:


Si no desea utilizar estas funciones debido a sus dependencias, puede utilizar los primeros bytes de los datos:

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


FileInfo puede hacer eso por usted:

$encoded_string = "...."; $imgdata = base64_decode($encoded_string); $f = finfo_open(); $mime_type = finfo_buffer($f, $imgdata, FILEINFO_MIME_TYPE);