2010-12-11 4 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, что делает переменную $ изображение на самом деле держать, если я хочу, чтобы напечатать что изображение в html, что я должен делать.

Update:

FYI: Я понимаю, PHP и HTML, так как я пытался узнать ООП в PHP и я наткнулся на статью, как этот конкретный код не ясно понимал меня так что я думал спрашивать вас, ребята , я очень ценю ваш ответ, я был бы благодарен, если бы вы могли попытаться объяснить код вместо того, чтобы попросить меня попробовать другой код.

Моя забота предназначена исключительно для обучения, я ее нигде не внедряю.

+1

Там нет переменной '$ image' в вашем примере кода. –

+1

@goreSplatter: первое предложение после кода: * и когда я создаю экземпляр образа объекта с синтаксисом '$ image = new Image (" pic.jpg ");' ... * –

ответ

1

Ваш $image будет содержать экземпляр класса Image.

Ваш constructor попытается открыть $filename. Если это невозможно, сценарий будет умирать/завершаться с сообщением об ошибке. Если $filename можно открыть, файл будет считан в переменную $buf и будет создан ресурс изображения GD.

Код неоптимальный по целому ряду причин:

  1. Заря ресурс, созданный imagecreatefromstring не назначен property of the Image class. Это означает, что весь процесс бессмыслен, потому что ресурс будет потерян после его создания. Работа, выполняемая в конструкторе, теряется.

  2. , вызывающий die, прекратит действие сценария. Невозможно обойти это. Было бы лучше throw an Exception to let the developer decide whether s/he wants the script to terminate or catch and handle this situation.

  3. чтение файла с fopen и fread работ, но file_get_contents is the preferred way to read the contents of a file into a string. будет использовать методы отображения памяти, если поддерживается ОС для повышения производительности.

  4. You should not do work in the constructor. Это вредно для проверки.

Лучше было бы использовать

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 … 
} 

Затем вы можете сделать

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

Источник должен быть URL-адресом изображения относительно корневого каталога веб-сервера.


Что касается кода, вы устанавливаете. Это было бы совершенно ненужным для использования HTML, а также ненужным для стандартного использования изображений в PHP, поскольку существуют прямые методы загрузки изображения из файла, например imagecreatefromjpeg() для файлов JPEG.

В своем роде конструктор вашего класса Image принимает имя файла, открывает этот файл и считывает все содержимое в виде двоичных данных в строку $buf, 4096 байт за раз. Затем он вызывает imagecreatefromstring($buf), чтобы преобразовать данные файла в ресурс изображения, который затем можно использовать далее в PHP с помощью PHP GD image handling functions.

Как я уже сказал, ничто из этого не имеет особого значения, если все, что вы хотите сделать, это отобразить существующее изображение в 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

моя забота - это чисто изучать язык, я тестирую и пытаюсь изучить ООП. –

+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); 
Смежные вопросы