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

これは、image属性のデータURIを使用して行うことができます。src

形式は次のとおりです。data:[<MIME-type>][;charset="<encoding>"][;base64],<data>

この例は、データ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" />
于 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

これを試して...

$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 に答える
4

他の可能性は、画像データを出力に生成するスクリプトを作成し、リンクをそこに向けることです。

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 にエンコードするよりも効率的です。

于 2010-01-15T10:04:38.520 に答える
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 に答える