Comment convertir une image en encodage base64?

290

Pouvez-vous s'il vous plaît me guider comment convertir une image d'une URL en encodage base64?

Volatil3
la source
3
Pourquoi voulez-vous faire cela?
Pekka
7
pour l'intégrer dans l'attribut src de la balise Img
Volatil3
5
C'est un vieux fil, mais pour être complet: il est très logique d'encoder des images, en particulier les petites (moins de 1k), pour une utilisation en CSS. De cette façon, vous enregistrez une demande, ce qui prendrait plus de temps et pourrait être encore plus important, en raison des frais généraux.
arminrosu

Réponses:

572

Je pense que ça devrait être:

$path = 'myfolder/myimage.png';
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($path);
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
Ronny Sherer
la source
10
Cela dépend de ce dont vous avez besoin de l'image. S'il s'agit d'une URL en ligne, c'est la voie à suivre. Ce n'est pas identique au simple encodage base64.
Pekka
Excellente astuce, maintenant je vais créer une fonction pour éditer le téléchargement de fichiers, ou revenir à move_uploaded_file (), merci
Vinicius De Jesus
121

Facile:

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

gardez à l'esprit que cela agrandira les données de 33% et vous aurez des problèmes avec les fichiers dont la taille dépasse la vôtre memory_limit.

Pekka
la source
1
@anna c'est le cas! Le codage Base64 fera généralement cela.
Pekka
38

Utilisez également cette façon de représenter l'image au format de codage base64 ... trouver la fonction PHP file_get_contentet à côté de la fonctionbase64_encode

et obtenir le résultat pour préparer str data:" . file_mime_type . " base64_encoded string. Utilisez-le dans l'attribut img src. voir le code suivant puis-je vous aider.

// 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
la source
1
Si vous ne parvenez pas à trouver la fonction mime_content_type, ajoutez simplement la fonction de svogal à partir de php.net/manual/en/function.mime-content-type.php
mario ruiz
15

Au cas où vous seriez (pour une raison quelconque) incapable d'utiliser curlni file_get_contents, vous pouvez contourner:

$img = imagecreatefrompng('...');
ob_start();
imagepng($img);
$bin = ob_get_clean();
$b64 = base64_encode($bin);
yckart
la source
10
<img src="data:image/png;base64,<?php echo base64_encode(file_get_contents("IMAGE URL HERE")) ?>">

J'essayais d'utiliser cette ressource mais continuais à recevoir une erreur, j'ai trouvé que le code ci-dessus fonctionnait parfaitement.

Vous venez de remplacer l'URL D'IMAGE ICI par l'URL de votre image - http://www.website.com/image.jpg

GoldenGonaz
la source
6

Très simple et à utiliser couramment:

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="">';

Remarque: Le type MIME du fichier sera ajouté automatiquement (en prenant l'aide de ce documentation PHP ).

Reza Mamun
la source
3

Voici le code à télécharger pour l'encoder et l'enregistrer sur 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 . "')");
    }
}

Pour afficher l'image, utilisez ceci

echo "<img src='data:image/jpeg;base64, $image' width=300>";
Vivek
la source
10
Cela n'a pas été demandé.
AlexioVay
1

Voici un exemple utilisant un appel cURL. C'est mieux que la fonction file_get_contents () . Bien sûr, utilisez 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
la source
1
curln'est absolument pas "mieux" que file_get_contentssi vous n'avez pas besoin d'ajouter des données supplémentaires à l'appel par ex. authentification. De plus, cela file_get_contentsreviendra à obtenir le contenu d'un fichier local lorsque cela sera possible, ne faisant donc pas un appel réseau inutile.
Hissvard
1

Vous pouvez également le faire via curl, il vous suffit d'avoir un chemin vers un fichier image et de le passer à la fonction indiquée ci-dessous.

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
la source