PHP:从二进制数据重新创build和显示图像

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

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

我想避免将图像存储到磁盘,并从那里获取或使用外部脚本…

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

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

这个例子直接来自Wikipedia页面上的数据URI :

 <?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" /> 

这实际上可以使用内联图像(称为数据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%

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

尝试这个…

 $img=base64_encode($row['PICTURE']); <img alt="105x105" class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php echo $img ?>"/> 

其他的可能性是创build一个脚本,产生图像数据到输出并指向链接。

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

编辑:对不起,我错过了不想要一个外部脚本的通知,但是这个解决scheme比编码图像到base64更有效率。

如果你只是想要的图像,没有任何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(),因为它已被弃用。