web-dev-qa-db-ja.com

php:バイナリデータから画像を再作成して表示する

バイナリデータからイメージを再作成(必要に応じて処理)し、すべて同じスクリプトで表示することは可能ですか?何かのようなもの

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

処理してそこから画像を取得した後、または外部スクリプトを使用して、画像をディスクに保存しないようにしたい...

31
Cambiata

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

形式は次のとおりです。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" />
61
Ben James

これは実際にインライン画像を使用して可能です( data URI sと呼ばれます)。

イメージタグは次のようになります。

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

ほとんどが良い考えではない理由:

  • ページの読み込みは遅くなります画像を取得する必要があるためbefore完全なHTML構造を読み込み、レンダリングすることができます。さらに、画像に対して追加の操作を実行している場合。サイトは、外部イメージである場合よりもはるかに遅く感じる可能性が非常に高くなります。

  • インライン画像はbase64でエンコードする必要があります、サイズに33%を追加します

合理的なトラフィックの多い公開サイトについて話している場合は、画像を外部に保存し、キャッシュすることをお勧めします。小規模なプロジェクトだけの場合は、インライン画像が役立つ場合があります。

22
Pekka 웃

これを試して...

$img=base64_encode($row['PICTURE']);

<img alt="105x105" class="img-responsive" src="data:image/jpg;charset=utf8;base64,<?php echo $img ?>"/>
4
erdemildiz

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

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

3
Krab

画像が必要な場合は、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()を置き換えることもできます。

2
riyad