【问题标题】:php: recreate and display an image from binary dataphp:从二进制数据重新创建并显示图像
【发布时间】: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...

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

【问题讨论】:

    标签: php image binaryfiles


    【解决方案1】:

    试试这个...

    $img=base64_encode($row['PICTURE']);
    
    <img alt="105x105" 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" 
          width="16" height="14" alt="embedded folder icon">
          

          为什么它们大多不是一个好主意:

          • 页面加载将减慢,因为需要在加载完整的 HTML 结构并进行渲染之前获取图像。如果您正在对图像执行其他操作,则更是如此。您的网站很可能会比外部图片慢得多。

          • 内嵌图像需要进行 base64 编码,尺寸增加 33%

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

          【讨论】:

          【解决方案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'); ?>" alt="An elephant" />
          

          【讨论】:

          • 谢谢本!正是我需要的!
          • 请注意,并非所有浏览器都能正确呈现数据 URI。确保你测试得很好......
          • 只是一个小提示:我得到的是红色图像而不是透明图像。
          • 谢谢 Ben,正是我想要的。
          猜你喜欢
          • 1970-01-01
          • 2014-06-12
          • 2013-04-03
          • 1970-01-01
          • 2019-12-20
          • 1970-01-01
          • 2011-01-04
          • 2014-12-12
          • 2012-03-13
          相关资源
          最近更新 更多