Как преобразовать изображение в кодировку base64?

291

Подскажите, пожалуйста, как мне преобразовать изображение из URL в кодировку base64?

Volatil3
источник
3
Для чего вы хотите это сделать?
Пекка
7
внедрить его в атрибут src тега Img
Volatil3
5
Это старый поток, но для полноты картины: имеет смысл кодировать изображения, особенно маленькие (до 1 Кб), для использования в css. Таким образом, вы сохраняете один запрос, который из-за накладных расходов займет больше времени и может быть даже больше.
arminrosu

Ответы:

576

Я думаю, что это должно быть:

$path = 'myfolder/myimage.png';
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($path);
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
Ронни Шерер
источник
10
Это зависит от того, для чего вам нужно изображение. Если это встроенный URL, это путь. Это не то же самое, что простое кодирование base64.
Пекка
Отличный совет, теперь я создам функцию для редактирования загрузки файла или возврата move_uploaded_file (), спасибо
Vinicius De Jesus
122

Легко:

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

имейте в виду, что это увеличит данные на 33%, и у вас будут проблемы с файлами, размер которых превышает ваш memory_limit.

Пекка
источник
1
@ Анна это делает! Кодировка Base64 обычно делает это.
Пекка
38

Используйте также этот способ для представления изображения в формате кодировки base64 ... найдите функцию PHP file_get_contentи следующую за ней функциюbase64_encode

и получить результат для подготовки ул data:" . file_mime_type . " base64_encoded string. Используйте его в атрибуте img src. см. следующий код, я могу помочь вам

// 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
Если не удалось найти функцию mime_content_type, просто добавьте функцию из svogal с php.net/manual/en/function.mime-content-type.php
mario ruiz
16

В случае, если вы (по какой-либо причине) не можете использовать curlни file_get_contents, вы можете обойти:

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

Я пытался использовать этот ресурс, но продолжал получать ошибку, я обнаружил, что приведенный выше код работал отлично.

Просто замените URL ИЗОБРАЖЕНИЯ ЗДЕСЬ на URL вашего изображения - http://www.website.com/image.jpg

GoldenGonaz
источник
6

Очень просто и обычно используется:

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

Примечание: Mime-тип файла будет добавлен автоматически (при помощи справки из этой документации PHP ).

Реза Мамун
источник
3

Вот код для загрузки, чтобы закодировать и сохранить его в 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 . "')");
    }
}

Для показа изображения используйте этот

echo "<img src='data:image/jpeg;base64, $image' width=300>";
Вивек
источник
10
Этого не просили.
AlexioVay
1

Вот пример использования вызова cURL. Это лучше, чем функция file_get_contents () . Конечно, используйте 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
источник
1
curlабсолютно не «лучше», чем file_get_contentsесли вам не нужно добавлять дополнительные данные в вызов ex. аутентификация. Более того, когда file_get_contentsэто будет возможно, мы вернемся к получению содержимого локального файла, таким образом не делая бесполезный сетевой вызов.
Хиссвард
1

Вы также можете сделать это с помощью curl, просто вам нужен путь к файлу изображения и передать его функции, указанной ниже.

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;

}
Тайяб Хуссейн
источник