2010-12-11 19 views
1

私は関数、クラス、メソッドなどのような基本を認識していますが、私は完全に以下のコードが画像を読むのに何が混乱しているのですか?最初にバイナリ形式でイメージを読み取らなければなりません。私はphpが画像を読み込んで読み込むためにプロセスに混乱しています。私は、このクラスのすべてのコードの機能と実際にコードで何が起こっているのかを知りたいと思います。助けが必要このPHPコードを理解する

コード:

class Image { 

    function __construct($filename) { 
    //read the image file to a binary buffer 
    $fp = fopen($filename, 'rb') or die("Image $filename doesn't exist"); 
    $buf = ''; 
    while(!feof($fp)) 
    $buf .= fgets($fp, 4096); 

    //create image 
    imagecreatefromstring($buf); 
    } 
} 

と私は構文$image = new Image("pic.jpg");で物体像をインスタンス化するとき私はそれを印刷したい場合には、変数$画像が実際に何を保持しない、HTMLで画像を印刷しません。私は何をしているのですか?

更新:FYI

:私はPHPでOOPを学ぶしようとしていたと私は君たちを尋ねると思ったので、この特定のコードは、私が明確に理解されていなかったとして、私は記事に出くわしたとして、私は、PHPやHTMLを理解します私はあなたの応答に非常に感謝します。異なるコードを試してみるのではなく、コードを説明していただければ幸いです。

私の関心事は学習目的のみのもので、私はどこにでも実装していません。

+1

あなたのコードサンプルには変数 '$のimage'はありませんを行うことができます

class Image { protected $_gdResource; public function loadFromFile($fileName) { $this->_gdResource = imagecreatefromstring( file_get_contents($fileName) ); if(FALSE === $this->_gdResource) { throw new InvalidArgumentException( 'Could not create GD Resource from given filename. ' . 'Make sure filename is readable and contains an image type ' . 'supported by GD' ); } } // other methods working with $_gdResource … } 

を使用することです。 –

+1

@goreSplatter:コードの後の最初の文:*と '$ image = new Image(" pic.jpg ");' ... * –

答えて

1

あなた$imageImageクラスのインスタンスが含まれます。

constructor$filenameを開こうとします。それが不可能な場合、スクリプトはエラーメッセージで終了/終了します。 $filenameを開くことができる場合、ファイルは$buf変数に読み込まれ、GDイメージリソースが作成されます。

コードは、多くの理由から最適以下である:imagecreatefromstringによって作成

  1. GDリソースはproperty of the Image classに割り当てられていません。これは、リソースが作成された後に失われるため、プロセス全体が無意味であることを意味します。コンストラクターで実行された作業は失われます。

  2. dieは、スクリプトを終了します。これを回避する方法はありません。それはあなたのOSでサポートされている場合、それはパフォーマンスを向上させるためにメモリマッピング技術を使用しますfile_get_contents is the preferred way to read the contents of a file into a string.fopenfread作品でファイルを読み込むthrow an Exception to let the developer decide whether s/he wants the script to terminate or catch and handle this situation.

  3. に良くなるだろうが。

  4. You should not do work in the constructor.テスト容易性には害があります。

より良いアプローチは、その後、あなたが

$image = new Image;    // to create an empty Image instance 
$image->loadFromFile('pic.jpg') // to load a GD resource 
+1

+1良い説明と良い良い変種。 – Orbling

2

HTMLでは、<img>タグのファイルを参照するだけで済みます。

<img src="/path/to/image/image.jpg" width="600" height="400" alt="Image Name" /> 

ソースは、Webサーバーのルートディレクトリを基準にしたイメージのURLである必要があります。


コードは、お入れします。 HTMLでの使用にはまったく必要ないでしょうし、PHPでの標準画像の使用には不要です。例えば、JPEGファイルの場合はimagecreatefromjpeg()というファイルから画像を読み込む直接的な方法があります。

Imageクラスのコンストラクタはファイル名をとり、そのファイルを開き、バイナリデータとしてバイナリデータとして文字列$buf,4096バイトずつを読み込みます。次にimagecreatefromstring($buf)を呼び出して、ファイルデータを画像リソースに変換します。画像リソースは、PHP GD image handling functionsでPHP内でさらに使用できます。

私が言っているように、あなたがしたいことがHTML内に既存の画像を表示するだけであれば特に重要ではありません。これらのコマンドは、画像の操作、検査、作成用に設計されています。

+0

の構文でオブジェクトイメージをインスタンス化すると、なぜマークダウンされますか?これは、要求されたときにコード内で何が起こっているのかを実際に説明する唯一の答えです(現在)。 :/ – Orbling

1

PHPのimagecreate*関数は、リソースを返します。

header('Content-Type: image/jpeg'); 
imagejpeg($img); 

は、詳細についてはGD and Image Functions documentationを参照してください:あなたはそれをクライアントに送信する場合は、適切なヘッダーを設定して、生の画像を送信する必要があります。

+0

これはイメージを読むために働く、ありがとう。 –

0

イメージを表示したいだけならば、上記のすべては無関係です。 HTMLイメージタグを書き出すだけで済みます(例:

echo '<img src="pic.jpg" />'; 

これだけです。

あなたが指定したコードは、操作のGDライブラリを使用して画像をロードするのに非常に長く不都合な方法をとります。それはほぼ確実にあなたがしたいことではありませんが、そうした場合は、代わりにimagecreatefromjpegを使用することができます。

+0

私の懸念は純粋に言語を学ぶことです、私はテストして、OOPを勉強しようとしています。 –

+0

もちろん、それは良い目標ですが、PHPで画像を表示する方法を知りたければ、投稿したコードは必要ありません。ここの記事のほとんどは、画像を表示するためにHTMLを出力するだけです。 HTMLなしで画像を強制的に表示したい場合、goreSplatterの答えはこれを示します。一部の余分なヘッダーを使用すると、ユーザーに保存場所を選択させることができます。しかしどちらの場合でも、表示されたコードはまだ役に立たない。 –

+0

ところで、どこからコードを入手したのか分かりませんが、コードがひどいので、他のコードを見て勉強してみることをおすすめします。 –

1
class Image 
{ 
    public $source = ''; 

    function __construct($filename) 
    { 
     $fp = fopen($filename, 'rb') or die("Image $filename doesn't exist"); 
     $buf = ''; 
     while(!feof($fp)) 
     { 
     $buf .= fgets($fp, 4096); 
     } 
     $this->source = imagecreatefromstring($buf); 
    } 
} 
$image = new Image('image.jpg'); 
/* use $image->source for image processing */ 
header('Content-Type: image/jpeg'); 
imagejpeg($image->source); 
関連する問題