35

是否可以从二进制数据重新创建图像(如果需要,处理它们)并显示它们,所有这些都在同一个脚本中?就像是

// 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...

我想避免在处理并从那里获取图像或使用外部脚本后将图像存储到磁盘...

4

5 回答 5

64

您可以使用图像属性中的数据 URI来执行此操作。src

格式为:data:[<MIME-type>][;charset="<encoding>"][;base64],<data>

此示例直接来自数据 URI 的 Wikipedia 页面

<?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" />
于 2010-01-15T09:47:55.733 回答
23

这实际上可以使用内联图像(称为数据 URI)。

您的图像标签看起来像这样:

<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%

如果您正在谈论一个合理的高流量公共站点,我建议您将图像存储在外部并缓存它们。如果它只是一个小项目,内联图像可能适合你。

于 2010-01-15T09:47:20.117 回答
4

您的另一种可能性是创建一个脚本,将图像数据生成到输出并将链接指向它。

图像.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 更有效。

于 2010-01-15T10:04:38.520 回答
4

试试这个...

$img=base64_encode($row['PICTURE']);

<img alt="105x105" class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php echo $img ?>"/>
于 2014-09-23T13:43:19.360 回答
3

如果您只想要图像,周围没有任何 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() 因为根据文档已弃用它。

于 2011-07-02T00:36:03.320 回答