¿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?

Volatil3
fuente
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);
Ronny Sherer
fuente
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.

Pekka
fuente
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.'">';
Raju Rajotia Jangid
fuente
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);
yckart
fuente
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

GoldenGonaz
fuente
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 ).

Reza Mamun
fuente
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>";
Vivek
fuente
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);?>">  
JeanAlesi
fuente
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;

}
Tayyab Hussain
fuente