是否可以从二进制数据中重新创建图像(如果需要,可以处理它们)并在同一个脚本中显示它们?像
这样的东西// get and display image 1:
$imagedata1 = file_get_contents('assets/test.png');
$imagedata1 = process_using_gd_or_something($imagedata1);
echo "<img src={$imagedata1} >"; // <-- IS THIS (OR EQUIVALENT) POSSIBLE?
// get and display image 2:
//etc...
我希望避免在处理完成后将图像存储到磁盘上,或者使用外部脚本...
答案 0 :(得分:61)
您可以使用图片src
属性中的数据URI 执行此操作。
格式为:data:[<MIME-type>][;charset="<encoding>"][;base64],<data>
此示例直接来自Wikipedia page on data URIs:
<?php
function data_uri($file, $mime)
{
$contents = file_get_contents($file);
$base64 = base64_encode($contents);
return ('data:' . $mime . ';base64,' . $base64);
}
?>
<img src="<?php echo data_uri('elephant.png','image/png'); ?>" alt="An elephant" />
答案 1 :(得分:22)
这实际上可以使用内嵌图像(称为data URI s)。
您的图片代码如下所示:
<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcpp
V0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7"
width="16" height="14" alt="embedded folder icon">
为什么他们大多不是一个好主意:
页面加载将放慢速度,因为在之前需要提取图像可以加载并呈现完整的HTML结构。如果您在图像上执行其他操作,则更是如此。您的网站很可能比外部图像感觉慢得多。
内嵌图片需要进行base64编码,将其大小增加33%。
如果您正在谈论一个合理的高流量公共网站,我建议您将图像存储在外部并缓存它们。如果它仅适用于小型项目,则内嵌图像可能适合您。
答案 2 :(得分:4)
试试这个......
$img=base64_encode($row['PICTURE']);
<img alt="105x105" class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php echo $img ?>"/>
答案 3 :(得分:3)
您的其他可能性是创建一个脚本,将图像数据生成到输出并将链接指向它。
image.php
$imagedata1 = file_get_contents('assets/test.png');
$imagedata1 = process_using_gd_or_something($imagedata1);
header('Content-type: image/png');
echo $imagedata1;
other_pages.php:
echo "<img src='image.php?some_params'>";
编辑: 对不起,我错过了不想要外部脚本的通知,但这个解决方案比将图像编码为base64更有效。
答案 4 :(得分:2)
如果您只想要图片,周围没有任何HTML,您可以使用以下内容:
$filename = 'assets/test.png';
$original_image = file_get_contents($filename);
$processed_image = process_the_image_somehow($original_image);
header('Content-type: '.mime_content_type($filename));
header('Content-Length: '.strlen($processed_image));
echo $processed_image;
您不能忘记Content-Length标头,否则它将无效。 您可能还希望替换根据文档弃用的mime_content_type()。