Como converter uma imagem em codificação base64?

290

Você pode me orientar como posso converter uma imagem de uma URL para codificação base64?

Volatil3
fonte
3
O que você quer fazer isso?
Pekka
7
incorporá-lo no atributo src da tag Img
Volatil3
5
Este é um tópico antigo, mas por uma questão de completude: faz muito sentido codificar imagens, especialmente pequenas (abaixo de 1k), para uso em css. Dessa forma, você salva uma solicitação, que levaria mais tempo e pode ser ainda maior, devido à sobrecarga.
Arminrosu 31/10/12

Respostas:

572

Eu acho que deveria 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
fonte
10
Depende do que você precisa da imagem. Se for um URL embutido, este é o caminho a percorrer. Não é idêntico à mera codificação base64.
Pekka
Dica excelente, agora vou criar uma função para editar o upload de um arquivo ou reverter move_uploaded_file (), obrigado
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);

lembre-se de que isso aumentará os dados em 33% e você terá problemas com arquivos cujo tamanho excede o seu memory_limit.

Pekka
fonte
1
@anna faz! A codificação Base64 geralmente faz isso.
Pekka
38

Use também desta maneira para representar a imagem no formato de codificação base64 ... encontre a função PHP file_get_contente a próxima a usar a funçãobase64_encode

e obtenha resultado para preparar str como data:" . file_mime_type . " base64_encoded string. Use-o no atributo img src. veja o código a seguir posso ajudá-lo.

// 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
fonte
1
Se não conseguiu encontrar a função mime_content_type basta adicionar a função de svogal de php.net/manual/en/function.mime-content-type.php
mario ruiz
15

Apenas no caso de você (por qualquer motivo) não poder usar curlnem file_get_contents, você pode contornar:

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

Eu estava tentando usar esse recurso, mas continuava recebendo um erro, achei o código acima funcionado perfeitamente.

Apenas substituí o URL de imagem AQUI pelo URL da sua imagem - http://www.website.com/image.jpg

GoldenGonaz
fonte
6

Muito simples e de uso comum:

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: O tipo MIME do arquivo será adicionado automaticamente (recebendo ajuda desta documentação do PHP ).

Reza Mamun
fonte
3

Aqui está o código para o upload codificar e salvá-lo no 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 a imagem, use este

echo "<img src='data:image/jpeg;base64, $image' width=300>";
Vivek
fonte
10
Isso não foi solicitado.
AlexioVay
1

Aqui está um exemplo usando uma chamada cURL. Isso é melhor que a função file_get_contents () . Obviamente, 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
fonte
1
curlabsolutamente não é "melhor" do que a file_get_contentsmenos que você precise adicionar dados adicionais à chamada ex. autenticação. Além disso, file_get_contentsserá possível obter o conteúdo de um arquivo local quando possível, não fazendo assim uma chamada de rede inútil.
Hissvard
1

Você também pode fazer isso via curl, basta precisar de um caminho para um arquivo de imagem e passá-lo para a função fornecida abaixo.

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
fonte