¿Cómo convertir una imagen a codificación base64?


290

¿Me pueden guiar cómo puedo convertir una imagen de una URL a codificación base64?


3
¿Para qué quieres hacer esto?
Pekka

77
incrustarlo en el atributo src de la etiqueta Img
Volatil3

55
Este es un hilo viejo, pero por completo: tiene mucho sentido codificar imágenes, especialmente las pequeñas (menos de 1k), para usar en CSS. De esta manera, guarda una solicitud, lo que llevaría más tiempo y podría ser aún mayor, debido a los gastos generales.
arminrosu

Respuestas:


572

Creo que debería ser:

$path = 'myfolder/myimage.png';
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($path);
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);

10
Depende de para qué necesita la imagen. Si es como una URL en línea, este es el camino a seguir. Sin embargo, no es idéntico a la mera codificación base64.
Pekka

Excelente consejo, ahora crearé una función para editar la carga de archivos, o revertir move_uploaded_file (), gracias
Vinicius De Jesus

121

Fácil:

$imagedata = file_get_contents("/path/to/image.jpg");
             // alternatively specify an URL, if PHP settings allow
$base64 = base64_encode($imagedata);

tenga en cuenta que esto aumentará los datos en un 33% y tendrá problemas con los archivos cuyo tamaño supere el suyo memory_limit.


1
@anna lo hace! La codificación Base64 generalmente hará eso.
Pekka

38

Úselo también para representar la imagen en formato de codificación base64 ... busque la función PHP file_get_contenty luego la función de usobase64_encode

y obtener resultado para preparar str as data:" . file_mime_type . " base64_encoded string. Úselo en el atributo img src. vea el siguiente código, ¿puedo ayudarlo?

// A few settings
$img_file = 'raju.jpg';

// Read image path, convert to base64 encoding
$imgData = base64_encode(file_get_contents($img_file));

// Format the image SRC:  data:{mime};base64,{data};
$src = 'data: '.mime_content_type($img_file).';base64,'.$imgData;

// Echo out a sample image
echo '<img src="'.$src.'">';

1
Si no puede encontrar la función mime_content_type, simplemente agregue la función de svogal desde php.net/manual/en/function.mime-content-type.php
mario ruiz

15

En caso de que (por cualquier razón) no pueda usar curlni file_get_contents, puede solucionar:

$img = imagecreatefrompng('...');
ob_start();
imagepng($img);
$bin = ob_get_clean();
$b64 = base64_encode($bin);

10
<img src="data:image/png;base64,<?php echo base64_encode(file_get_contents("IMAGE URL HERE")) ?>">

Estaba tratando de usar este recurso pero seguía recibiendo un error, encontré que el código anterior funcionaba perfectamente.

Acabo de reemplazar la URL de IMAGEN AQUÍ con la URL de su imagen: http://www.website.com/image.jpg


6

Muy simple y de uso común:

function getDataURI($imagePath) {
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $type = $finfo->file($imagePath);
    return 'data:'.$type.';base64,'.base64_encode(file_get_contents($imagePath));
}

//Use the above function like below:
echo '<img src="'.getDataURI('./images/my-file.svg').'" alt="">';
echo '<img src="'.getDataURI('./images/my-file.png').'" alt="">';

Nota: El tipo Mime del archivo se agregará automáticamente (tomando la ayuda de esta documentación de PHP ).


3

Aquí está el código para cargar para codificar y guardarlo en MySQL

if (!isset($_GET["getfile"])) {
    if ($_FILES["file"]["error"] > 0) {
        echo "Error: " . $_FILES["file"]["error"] . "<br>";
    } else {
        move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);

        $bin_string = file_get_contents($_FILES["file"]["name"]);
        $hex_string = base64_encode($bin_string);
        $mysqli = mysqli_init();

        if (!$mysqli->real_connect('localhost', 'root', '', 'arihant')) {
            die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
        }

        $mysqli->query("INSERT INTO upload(image) VALUES ('" . $hex_string . "')");
    }
}

Para mostrar la imagen usa esto

echo "<img src='data:image/jpeg;base64, $image' width=300>";

10
Esto no fue pedido.
AlexioVay

1

Aquí hay un ejemplo usando una llamada cURL. Esto es mejor que la función file_get_contents () . Por supuesto, use base64_encode ()

$url = "http://example.com";

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
?>

<img src="data:image/png;base64,<?php echo base64_encode($output);?>">  

1
curlno es absolutamente "mejor" que a file_get_contentsmenos que necesite agregar datos adicionales a la llamada, ej. autenticación. Además, file_get_contentsrecurrirá a obtener el contenido de un archivo local cuando sea posible, por lo tanto, no hará una llamada de red inútil.
Hissvard

1

También puede hacer esto a través de curl, solo necesita una ruta a un archivo de imagen y pasarlo a la función dada a continuación.

public static function getImageDataFromUrl($url)
{
    $urlParts = pathinfo($url);
    $extension = $urlParts['extension'];
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    $response = curl_exec($ch);
    curl_close($ch);
    $base64 = 'data:image/' . $extension . ';base64,' . base64_encode($response);
    return $base64;

}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.