Jak przekonwertować obraz na kodowanie base64?


290

Czy możesz mi pomóc, jak przekonwertować obraz z adresu URL na kodowanie base64?


3
Po co chcesz to robić?
Pekka

7
osadzić go w atrybucie src znacznika Img
Volatil3,

5
To jest stary wątek, ale dla kompletności: sensowne jest kodowanie obrazów, zwłaszcza małych (poniżej 1k), do użycia w css. W ten sposób zapisujesz jedno żądanie, które może potrwać dłużej, a może być jeszcze większe ze względu na obciążenie.
arminrosu

Odpowiedzi:


573

Myślę, że powinno to być:

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

10
To zależy od tego, do czego potrzebujesz obrazu. Jeśli jest to wbudowany adres URL, jest to odpowiedni sposób. Nie jest to jednak identyczne ze zwykłym kodowaniem base64.
Pekka

Doskonała wskazówka, teraz utworzę funkcję edycji pliku do przesłania lub przywróć plik move_uploaded_file (), dzięki
Vinicius De Jesus

121

Łatwo:

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

pamiętaj, że zwiększy to dane o 33%, a będziesz mieć problemy z plikami, których rozmiar przekracza twój memory_limit.


1
@anna to robi! Generalnie wystarczy kodowanie Base64.
Pekka

38

Skorzystaj również w ten sposób, aby przedstawić obraz w formacie kodowania base64 ... znajdź funkcję PHP, file_get_contenta następnie użyj funkcjibase64_encode

i uzyskaj wynik, aby przygotować str data:" . file_mime_type . " base64_encoded string. Użyj go w atrybucie img src. zobacz poniższy kod, czy mogę ci pomóc.

// 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
Jeśli nie udało się znaleźć funkcji mime_content_type, po prostu dodaj funkcję z svogal z php.net/manual/en/function.mime-content-type.php
mario ruiz

15

Na wypadek, gdybyś (z jakiegokolwiek powodu) nie był w stanie używać curlani file_get_contentsnie możesz obejść:

$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")) ?>">

Próbowałem użyć tego zasobu, ale ciągle pojawiał się błąd, ale powyższy kod działał idealnie.

Właśnie zastąpiłem IMAGE URL TUTAJ URL twojego obrazu - http://www.website.com/image.jpg


6

Bardzo prosty i powszechnie stosowany:

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

Uwaga: Typ Mime pliku zostanie dodany automatycznie (korzystając z pomocy tej dokumentacji PHP ).


3

Oto kod do przesłania w celu zakodowania i zapisania go w 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 . "')");
    }
}

Do wyświetlenia obrazu użyj tego

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

10
To nie było wymagane.
AlexioVay,

1

Oto przykład użycia wywołania cURL. Jest to lepsze niż funkcja file_get_contents () . Oczywiście użyj 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
curlabsolutnie nie jest „lepszy” niż, file_get_contentschyba że musisz dodać dodatkowe dane do połączenia np. poświadczenie. Co więcej, file_get_contentscofnie się do uzyskania zawartości lokalnego pliku, gdy to możliwe, nie wykonując bezużytecznego połączenia sieciowego.
Hissvard,

1

Możesz to również zrobić za pomocą curl, po prostu potrzebujesz ścieżki do pliku obrazu i przekaż go do funkcji podanej poniżej.

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;

}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.