如何使用PHP将大量base64图像数据转换回图像?

时间:2011-03-22 14:46:54

标签: php image base64

我有一大串base64图像数据(大约200K)。当我尝试通过使用正确的头输出解码数据来转换该数据时,脚本就会死掉,好像没有足够的内存。我的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 个答案:

答案 0 :(得分:2)

由于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 :(得分:1)

好的,这是一个更接近的解决方案。虽然这似乎以较小的块解码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');
?>

答案 2 :(得分:0)

Content-length必须指定实际(已解码)内容长度,而不是base64编码数据的长度。

虽然我不确定修复它会解决这个问题......

答案 3 :(得分:-1)

使用imagejpeg()将base64字符串保存到图像文件或使用不同格式的正确函数,然后使用简单的<img>标记显示图像。