Как я могу преобразовать большую строку данных изображения base64 обратно в изображение с помощью PHP? - PullRequest
1 голос
/ 22 марта 2011

У меня есть большая строка данных изображения base64 (около 200 КБ).Когда я пытаюсь преобразовать эти данные путем вывода декодированных данных с правильным заголовком, сценарий умирает, как будто не хватает памяти.Я не получаю ошибку в моих журналах Apache.Приведенный ниже пример кода работает с небольшими изображениями.Как я могу декодировать большое изображение?

<?php
// function to display the image

function display_img($imgcode,$type) {  
     header('Content-type: image/'.$type);   
     header('Content-length: '.strlen($imgcode));   
     echo base64_decode($imgcode);  
}

$imgcode = file_get_contents("image.txt");  

// show the image directly  
display_img($imgcode,'jpg');

?>

Ответы [ 4 ]

2 голосов
/ 22 марта 2011

Поскольку base64 -кодированные данные четко разделяются каждые 4 байта (т.е. 3 байта открытого текста кодируются в 4 байта текста в кодировке base64), вы можете разделить строку b64 на кратные 4 байта, и обрабатывать их отдельно:

while (not at end of string) {
   take next 4096 bytes // for example - 4096 is 2^12, therefore a multiple of 4
   // you could use much larger blocks, depends on your memory limits
   base64-decode them
   append the decoded result to a file, or a string, or send it to the output
}

Если у вас есть допустимая строка base64, это будет работать так же, как и все сразу.

1 голос
/ 22 марта 2011

ОК, вот более близкое разрешение. Хотя это, кажется, декодирует данные base64 небольшими порциями, я все еще не получаю изображение в браузере. Если я отображаю данные перед тем, как поместить заголовок, я получаю вывод. Опять же, это работает с маленьким изображением, но не с большим. Мысли

<?php
// function to display the image
function display_img($file,$type) {
    $src = fopen($file, 'r');
    $data = "";
    while(!feof($src)) {
        $data .= base64_decode(fread($src, 4096));
    }
    $length = strlen($data);
    header('Content-type: image/'.$type);
    header('Content-length: '.$length);
    echo $data;
}

// show the image directly
display_img('image.txt','jpg');
?>
0 голосов
/ 02 июня 2016

Сохраните строку base64 в файл изображения, используя imagejpeg() или правильную функцию для различных форматов, а затем отобразите изображение с простым тегом <img>.

0 голосов
/ 22 марта 2011

Длина содержимого должна указывать фактическую (декодированную) длину содержимого, а не длину закодированных данных base64.

Хотя я не уверен, что это поможет решить эту проблему ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...