php:从二进制数据重新创建并显示图像
Posted
技术标签:
【中文标题】php:从二进制数据重新创建并显示图像【英文标题】:php: recreate and display an image from binary data 【发布时间】:2011-01-05 10:48:03 【问题描述】:是否可以从二进制数据重新创建图像(如果需要,处理它们)并显示它们,所有这些都在同一个脚本中?类似的东西
// 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...
我想避免在处理并从那里获取图像后将图像存储到磁盘,或者使用外部脚本...
【问题讨论】:
【参考方案1】:试试这个...
$img=base64_encode($row['PICTURE']);
<img class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php echo $img ?>"/>
【讨论】:
【参考方案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(),因为根据文档已弃用它。
【讨论】:
【参考方案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】:这实际上可以使用内联图像(称为data URIs)。
你的图片标签看起来像这样:
<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcpp
V0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7"
>
为什么它们大多不是一个好主意:
页面加载将减慢,因为需要在加载完整的 HTML 结构并进行渲染之前获取图像。如果您正在对图像执行其他操作,则更是如此。您的网站很可能会比外部图片慢得多。
内嵌图像需要进行 base64 编码,尺寸增加 33%。
如果您正在谈论一个合理的高流量公共网站,我建议您将图像存储在外部并缓存它们。如果只是针对小型项目,内嵌图片可能适合您。
【讨论】:
+1 列出缺点。根据经验,这种技术应该用于相对较小(尺寸明智)的图像,例如W3 验证器上的图标指示器:validator.w3.org/check?uri=http%3A//***.com/questions/… 谢谢你,佩卡! *** 和(它的用户)规则!【参考方案5】:您可以使用图像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'); ?>" />
【讨论】:
谢谢本!正是我需要的! 请注意,并非所有浏览器都能正确呈现数据 URI。确保你测试得很好...... 只是一个小提示:我得到的是红色图像而不是透明图像。 谢谢 Ben,正是我想要的。以上是关于php:从二进制数据重新创建并显示图像的主要内容,如果未能解决你的问题,请参考以下文章