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:[&lt;MIME-type&gt;][;charset="&lt;encoding&gt;"][;base64],&lt;data&gt;

这个例子直接来自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:从二进制数据重新创建并显示图像的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC 中从二进制文件加载图像

从二进制数据流中构造GDAL能够读取的图像数据

PHP:从二进制数据流中解压缩32位整数

从二进制获取图像尺寸和图像大小

将任何文件转换为二进制字符串并从二进制转换为文件[关闭]

如何在 JavaScript 中从二进制数据创建 File 对象