2012-01-21 16 views
3

画像をレンダリングできるいくつかの関数を持つクラスがあります。phpで画像をレンダリングし、htmlで出力する<img>タグ

// render.php 
class Render { 
    public function Render($some_arguments) { 
     ... 
     header("Content-Type: image/png"); 
     $im = @imagecreate(110, 20) 
      or die("Cannot Initialize new GD image stream"); 
     $background_color = imagecolorallocate($im, 0, 0, 0); 
     $text_color = imagecolorallocate($im, 233, 14, 91); 
     imagestring($im, 1, 5, 5, "A Simple Text String", $text_color); 
     imagepng($im); 
     return "data:image/png;base64,".base64_encode($im); 
    } 
} 

は、それから私は、htmlコードが含まれていますし、私のPHPファイルを持っている私は、< img>タグ内に出力した画像をご希望の場所:

// index.php 
include("render.php"); 
$render = new Render(); 
echo "<htlm><head></head><body>"; 
echo "<img src=\"".$render->Render(1)."\" />"; 
echo "</body></html>"; 

私は私のブラウザでのindex.phpを実行すると、私だけ空白の画面が表示されます。

私は画像ソースとして関数呼び出しを使用できませんか? < img src="render_image.php" />のようなPHPファイルをソースとして使うことができますが、オブジェクト指向の方法で引数を送ることはできません(引数を取り出すために$ _GETを使うことができます)。しかし、素晴らしいオブジェクト指向の書かれたコード。

したがって、関数呼び出しをhtmlタグのソースとして使用する方法はありますか?

+0

あなたが機能していないゴミを、ない空白の画面を取得する必要があります。 error_reportingを発生させるか、error.logを調べます。また、 ' - > Render()'関数はimgデータを出力し、それを返すことはありません。オブジェクトインターフェイスではなく、最初に作業します。 – mario

答えて

3

であるあなたはそれを分割する必要があります:

Render(...)は、一時ファイルを書き込みます。 (無作為化された名前で)、それはしばらくの間Webからアクセス可能です。

新しいメソッドOutput()は、上記のランダム化された名前を返します。

次に、HTMLを出力する前にRender()と呼び出して、Output()を使用してURLを埋め込みます。

代わりに、ファイルやデータベースを使用してパラメータを交換することができます。本質的にはいくつかの方法がありますPrepare(...)?ファイルやデータベースにパラメータを書き込んで、それらを読み込んでファイルを再配置するなどの方法があります。

さらに別の方法(ファイルシステムへの書き込みなし):data: uriを使用して画像データをインクルードすることもできます画像のサイズは使用されるブラウザによって制限され、このようにデータをキャッシュすることはできません(つまり、常に送信する必要があります)。

あなたが達成しようとしていることに応じて、幸運にもSVG画像を埋め込むことができます。欠点は、最新のブラウザ(data:に似ています)でのみサポートされていますが、サイズの制限はありません。


編集:それは少しトリッキーこのようなものになるのget(未テストが、動作するはずです)をbase64 /埋め込まれたアプローチを使用する:

ob_start(); // buffers future output 
imagepng($img); // writes to output/buffer 
$b64 = base64_encode(ob_get_contents()); // returns output 
ob_end_clean(); // clears buffered output 
+0

私はob_start()であなたの例を使って作業しています。出力バッファから読み込んだときにページの読み込みが遅くなるのか、それともこれが完全に正当な方法で問題を解決するのですか?バッファーからの読み込み速度は、同時にいくつの訪問者が私のホームページにあり、ホームページを遅くするかによって異なりますか? – Rox

+0

この場合、重大な遅延に気付かないでください。 'ob_start()'は、出力を 'stdout'に送る(スクリプトが終了するか、' ob_end _ *() '関数のどれかが使用されるまで)PHPを待機させるだけです。最初にディスクに書き込む方がずっと効果的です。背後では、ストリームに書き込んだり、コンテンツをもう一度読み込んだりするのと似ています。画像が本当に巨大でない限り、より多くの訪問者が目立つ影響を与えるべきではありません。しかし、一方では:もしこれがこのような問題を引き起こすならば、他の解決法もそうするでしょう。私が言及したように、あまりにも巨大な画像には使用しないでください。 – Mario

4

あなたはBASE64は、画像を符号化し、データURLスキームを使用することができます

data:[<MIME-type>][;charset=<encoding>][;base64],<data> 

などを。

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot"> 

したがって、生のイメージではなく、そのイメージを含めると、必要なものを正確に行うことができます。

Wikipedieaからの例)

+0

ディスクからPNGファイルを読み込むときに動くようになりましたが、PHP関数imagecreateimagepngを使ってイメージングを動的に作成すると、HTMLコンテンツではなく画像が印刷されます。上記の私の例を見てください。 – Rox

+0

私の答えは、動的画像で動作するアプローチを含めるように更新されました。 – Mario

+0

はい。だからあなたのやり方は、あなたのimgタグのsrc = ''パラメータがこのようなPHPスクリプトを指すようにすることです()、そのPHPスクリプト(render_image.php)はレンダー機能をそのまま実行し、ヘッダを出力しますおよび生成された画像の本体を含む。これはハードディスクに画像データを書き込まなくても動作します。 – ralfe

1

私はしばらく前にほとんど同じ問題を抱えていました。あなたはここに解決し、それのいくつかの可能性のある問題を見つけることができます:私はあなたが探していると思うInline generated images exceeding length

基本的には<img src="data:image/png;base64,[data in base64]"/>

2

空白の画面のための最も可能性の高い原因は持っています送信されているヘッダーデータの2つのセットと関係がある。だから、まずあなたはこの文を実行している:

自動的にブラウザに送信されたデータのコンテンツタイプを設定します
echo "<htlm><head></head><body>"; 

。 次に、あなたがこの行で実行されている:

この行が実行されます
echo "<img src=\"".$render->Render(1)."\" />"; 

:その後、

header("Content-type: image/png"); 

これをすでに最初によって送られてきたものとは異なるヘッダーを設定しようエコーステートメント。

ファイル名を受け入れ、そのファイルにイメージを書き込んで、書き込まれたイメージファイルを指すパスを返すためにRender()関数をchaningすることをお勧めします。そうすれば、画像ファイルとhtmlファイルを同じストリームでブラウザに出力しようとしているわけではありません。

よろしく、 Ralfe

+0

ディスクに保存されていないファイルを作成することはできますか?イメージをディスクに保存したいだけでなく、作成してブラウザに表示されるようにする必要はありません。 – Rox

関連する問題