Php gd2


Вот какой код работает. В принципе, он отделяет альфа-канал, изменяет размер изображения с помощью гамма-коррекции, изменяет альфа-канал без гамма-коррекции, затем копирует по альфа-каналу на измененное изображение, которое было сделано с правильной гаммой.

Я предполагаю, что функция imagegammacorrect() имеет ошибку. Возможно, гамма применима только к RGB, и GD пытается сделать то же вычисление в альфа-канал? Теория цвета не моя сильная сторона.

Во всяком случае, вот код. К сожалению, я не смог найти лучший способ выделить каналы, чем перебирать пиксели один за другим. О, хорошо…

<?php // Load image $image = imagecreatefrompng('test-image.png');  // Create destination $resized_image = imagecreatetruecolor(100, 100); imagealphablending($resized_image, false); // Overwrite alpha imagesavealpha($resized_image, true);  // Create a separate alpha channel $alpha_image = imagecreatetruecolor(200, 200); imagealphablending($.  

gegammacorrect($resized_image, 1.0, 2.2); // Resize alpha channel $alpha_resized_image = imagecreatetruecolor(200, 200); imagealphablending($alpha_resized_image, false); imagesavealpha($alpha_resized_image, true); imagecopyresampled($alpha_resized_image, $alpha_image, 0, 0, 0, 0, 100, 100, 200, 200); // Copy alpha channel back to resized image for ($x = 0; $x < 100; $x++) { for ($y = 0; $y < 100; $y++) { $alpha = (imagecolorat($alpha_resized_image, $x, $y) >> 24) & 0xFF; $rgb = imagecolorat($resized_image, $x, $y); $r = ($rgb >> 16 ) & 0xFF; $g = ($rgb >> 8 ) & 0xFF; $b = $rgb & 0xFF; $color = imagecolorallocatealpha($resized_image, $r, $g, $b, $alpha); imagesetpixel($resized_image, $x, $y, $color); } } imagepng($resized_image, 'test-image-scaled.png'); ?>

Замените жестко закодированные значения на переменные, конечно… И вот результат, который я получаю с помощью вашего изображения и моего кода:

Измененное изображение http://www.jejik.com/sander/test-image-scaled.png

qaru.site


Основы работы с библиотекой GD

От автора: очень часто при разработке скриптов необходимо работать с изображениями, используя язык PHP. К примеру, генерация изображений с нуля или редактирование уже существующих и т.д. Поэтому в данном уроке мы с Вами изучим основы работы с библиотекой GD, которая предназначена для обработки изображений средствами языка PHP.

Введение

Язык PHP достаточно разнообразен и его использование не ограничивается только созданием скриптов, выполняющим различные манипуляции с данными. Он также позволяет работать с различными графическими элементами, в частности с изображениями, разных форматов. Для этих целей написана, специальная библиотека, под названием GD, которая расширяет его стандартный функционал. Данная библиотека, чем-то похожа на небольшой графический редактор, используя который, Вы сможете легко обрабатывать изображения, используя только язык PHP. Библиотека GD, позволяет создавать новые изображения, редактировать уже существующие, копировать одни изображения на другие, изменять размеры, а также наносить текст на изображения.


Поэтому, так как, библиотека является расширением, значит необходимо убедиться, что она подключена в Вашем интерпретаторе языка PHP. Для этого необходимо открыть главный конфигурационный файл PHP – php.ini. Если Вы используете Denver, значит Вам необходимо, перейти в виртуальный диск, созданный им (в моем случае это диск Z). И затем по адресу: Z:usrlocal php5. В корне папки php5 Вы найдете необходимый файл. Далее открываем данный файл в текстовом редакторе, находим строчку: extension=php_gd2.dll

Если напротив данной строки, нет символа “;” (точка с запятой), значит расширение подключено, если же символ есть – его необходимо удалить и перезапустить Denver. В этом случае Вы подключите библиотеку. Теперь можно приступать к работе с данной библиотекой.

Основы создания и редактирования изображений

Для того чтобы вывести на экране изображение, необходимо использовать тег img и в атрибуте src, данного тега, нужно указать путь к изображению. Но в нашем случае изображение создается при помощи языка PHP. Поэтому в атрибуте src мы укажем путь к файлу php, который создаст нужное нам изображение. Значит, создаем файл index.php, который будет выводить на экран изображение, со следующим содержимым:

Здесь, мы определяем кодировку, путем отправки заголовка браузеру и выводим изображение при помощи тега img. Далее создаем файл index.php и начинаем писать код. Итак, как в любом графическом редакторе, перед тем как создать изображение, необходимо создать пустой лист, или пустое изображение. Непосредственно на котором, мы будем создавать нужное нам изображение. Библиотека GD не исключение, поэтому первым делом создадим пустое изображение:


Функция imagecreatetruecolor() — создает новое полноцветное изображение, с заданными размерами. Размеры (ширину и высоту) передаем параметрами к данной функции. Функция возвращает дискриптор (ресурс), открытого изображения, необходимый для дальнейшей работы с ним. Так как он, как бы, идентифицирует наше изображение. Теперь давайте выведем на экран наше изображение. Для этого добавим следующий код:

Смотрите, первым делом отправляем заголовок браузеру – то есть, сообщаем, что тип отображаемого контента – это изображение типа image/jpeg. Затем вызываем функцию imagejpeg(), которая выводит или сохраняет изображение, в зависимости от состояния второго параметра. Параметры передаваемые данной функции:

Теперь давайте посмотрим в браузере, что у нас получилось:

Php gd2

Теперь, давайте посмотрим, как создать изображение, используя существующее. К примеру, исходное изображение имеет формат jpeg, значит для изображения формата jpeg, необходимо создать следующую функцию:


Функция imagecreatefromjpeg() — создает новое изображение из файла или URL (формата jpeg) и возвращает его дискриптор. Параметром необходимо передать путь к изображению. Если у Вас исходное изображение другого формата, то воспользуйтесь одной из следующих функций:

Далее определим ширину и высоту созданного пустого изображения:

Думаю, Вы уже догадались, что функция imagesx() – возвращает ширину выбранного изображения в пикселях. А функция imagesу() – высоту. Обеим функциям необходимо передать параметром дискриптор открытого изображения. Перед тем, как изобразить что то, на пустом изображении, необходимо определить цвет, при помощи которого мы будем отображать различные фигуры, текст и т.д. Для этого используется функция imagecolorallocate($im,$red,$green,$blue), которая создает цвета для изображений. При этом возвращает идентификатор цвета в соответствии с заданными RGB параметрами. То есть для каждого цвета, который Вы хотите определить, необходимо вызывать данную функцию. Параметрами необходимо передавать следующие значения:

Теперь давайте, определим несколько цветов:

Теперь давайте нарисуем закрашенный прямоугольник на пустом изображении. Для этого добавим следующий код:

Функция imagefilledrectangle() – рисует закрашенный прямоугольник, на выбранном изображении. Параметры, которые необходимо передать:

Давайте перейдем в браузер и посмотрим, что у нас получилось:

Php gd2

Далее, давайте научимся рисовать окружности и дуги. Для этого используем функцию imagefilledarc():

Параметры, которые необходимо передать данной функции:

Давайте перейдем в браузер и посмотрим, что у нас получилось:


Php gd2

Вот мы с Вами получили окружность. Теперь давайте еще добавим несколько окружностей и дуг:

Теперь на экране мы увидим смайлик:

Php gd2

Далее, давайте посмотрим как отобразить на изображении первый символ произвольной строки. Для этого используем две аналогичные функции:

Функции imagechar() и imagecharup(), аналогичны по своей работе, только imagechar() – выводит символ по горизонтали, а imagecharup() – по вертикали. Параметры, которые необходимо передать данным функциям:

Теперь давайте посмотрим, каким образом можно исказить изображение. Для этого мы используем следующий код:

Итак, функция imageconvolution() — накладывает искривляющую матрицу на изображение, тем самым, искажая его нормальный вид. Параметры, которые необходимо передать данной функции:

Теперь давайте посмотрим, как применение последней функции, повлияет на изображение:


Php gd2

Теперь научимся изображать многоугольники. Для этого используем функцию imagefilledpolygon(), которая изображает закрашенный многоугольник:

Параметры, которые необходимо передать данной функции:

Давайте посмотрим, что у нас получилось, при этом закомментируем строки, искажающее изображение:

Php gd2

Вот мы с Вами изобразили многоугольник. Теперь давайте нарисуем простую линию. Для этого используем функцию imageline():

Функция imageline() – изображает прямую линию. Параметры, которые необходимо передать:

Давайте перейдем в браузер и посмотрим, что получилось:

Php gd2

Как Вы видите линия успешно нарисована.

Копирование изображений

Теперь давайте научимся копировать и изменять размеры изображений. Так как у нас есть открытое изображение, я предлагаю скопировать его на наш рисунок который мы создаем в данном уроке. Для этого воспользуемся функцией imagecopy(), которая выполняет копирование изображений, как полностью так и по частям. Итак вызовем данную функцию:

Параметры которые необходимо передать данной функции:

Теперь давайте перейдем в браузер и посмотрим, что у нас получилось:


Php gd2

Как Вы видите мы скопировали часть изображения. Теперь давайте не просто скопируем изображение, а как бы наложим одно на другое. Для этого мы используем функцию — imagecopymerge(), которая выполняет копирование изображения, всего или только его части, с наложением. По своей работе данная функция полностью аналогична предыдущей функции, и отличается только тем, что она принимает на один параметр больше (параметр pct). Который отвечает за наложение одного изображения на другое, и может варьироваться от 0 до 100. Когда pct = 0, наложения не происходит. В случае значения 100 эта функция ведет себя аналогично функции imagecopy(). Давайте вызовем данную функцию:

Зададим степень наложения 50% и давайте посмотрим, что получилось:

Php gd2

В библиотеке GD есть еще одна аналогичная функция, которая выполняет копирование с наложением, за исключением того что копирование и наложение происходит в градациях серого. То есть копируемое изображение, будет наложено на исходное и будет черно-белым. Вот данная функция: imagecopymergegray(), передавать ей необходимо те же параметры, что и функции imagecopymerge().

И последняя функция, которую мы с Вам рассмотрим в данном разделе — это функция imagecopyresampled(), которая выполняет копирование изображений с масштабированием. Поэтому давайте вызовем данную функцию:

Параметры, которые необходимо передать данной функции:

Теперь давайте перейдем в браузер и посмотрим, что у нас получилось:


Php gd2

Нанесение текста на изображение

Для нанесения текста на изображение, используем функцию imagettftext(), которая рисует текст на изображении шрифтом TrueType. Для данного урока я подготовил два TrueType шрифта и скопировал их в папку fonts. Теперь давайте вызовем данную функцию:

Параметры которые необходимо передать данной функции:

Теперь давайте перейдем в браузер и посмотрим, что у нас получилось:

Php gd2

На этом этапе данный урок можно завершать. Мы с Вами рассмотрели основы работы с библиотекой GD, конечно она содержит еще много интересных функций, но зная ее основы, думаю Вам не составит труда разобраться в остальных.

Всего Вам доброго, удачного кодирования! И увидимся в следующих уроках!!!

Php gd2


webformyself.com

Вот мои действия, я захожу в папку Webservers/usr/lochal/php5/ там есть фаил php ini и еще несколько других файлов, есть так-же папка ext, но как я уже написал файл php ini не в ней, а сразу же в папке php5.Я открываю php ini при помощи Edit with Notepad++ и там в 601 строчке у меня прописанно extension=php_gd2.dll черным цветом, другие строчки extension зеленые если это важно значит ли это что у меня есть gd2.
  error_log Apache я так понимаю это в папке local/apache/logs/ , там текстовый документ error.log захожу в него вот что там
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: subdomain.test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:130) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: subdomain.localhost:443 (Z:/usr/local/apache/conf/vhosts.conf:107) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: magazin.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:84) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: localhost:443 (Z:/usr/local/apache/conf/vhosts.conf:38) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: You should not use name-based virtual hosts in conjunction with SSL!!
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: subdomain.test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:130) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: subdomain.localhost:443 (Z:/usr/local/apache/conf/vhosts.conf:107) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: magazin.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:84) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: localhost:443 (Z:/usr/local/apache/conf/vhosts.conf:38) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: You should not use name-based virtual hosts in conjunction with SSL!!
[Fri Aug 09 16:36:19 2013] [notice] Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8d PHP/5.2.4 configured — resuming normal operations
[Fri Aug 09 16:36:19 2013] [notice] Server built: Jan  9 2007 23:17:20
[Fri Aug 09 16:36:19 2013] [notice] Parent: Created child process 3052
[Fri Aug 09 16:36:19 2013] [notice] Disabled use of AcceptEx() WinSock2 API
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: subdomain.test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:130) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: subdomain.localhost:443 (Z:/usr/local/apache/conf/vhosts.conf:107) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: magazin.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:84) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: SSL server IP/port conflict: localhost:443 (Z:/usr/local/apache/conf/vhosts.conf:38) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:19 2013] [warn] Init: You should not use name-based virtual hosts in conjunction with SSL!!
[Fri Aug 09 16:36:20 2013] [warn] Init: SSL server IP/port conflict: subdomain.test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:130) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:20 2013] [warn] Init: SSL server IP/port conflict: subdomain.localhost:443 (Z:/usr/local/apache/conf/vhosts.conf:107) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:20 2013] [warn] Init: SSL server IP/port conflict: magazin.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:84) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:20 2013] [warn] Init: SSL server IP/port conflict: localhost:443 (Z:/usr/local/apache/conf/vhosts.conf:38) vs. test1.ru:443 (Z:/usr/local/apache/conf/vhosts.conf:153)
[Fri Aug 09 16:36:20 2013] [warn] Init: You should not use name-based virtual hosts in conjunction with SSL!!
[Fri Aug 09 16:36:20 2013] [notice] Child 3052: Child process is running
[Fri Aug 09 16:36:20 2013] [notice] Child 3052: Acquired the start mutex.
[Fri Aug 09 16:36:20 2013] [notice] Child 3052: Starting 250 worker threads.
[Fri Aug 09 16:36:20 2013] [notice] Child 3052: Listening on port 443.
[Fri Aug 09 16:36:20 2013] [notice] Child 3052: Listening on port 8648.
[Fri Aug 09 16:36:20 2013] [notice] Child 3052: Listening on port 443.
[Fri Aug 09 16:36:20 2013] [notice] Child 3052: Listening on port 80.

На основании этих данных можно сделать какой то вывод обращаюсь к capricorn.

И сapricorn, очень вас прошу помогите решить проблему до победного, вижу вы разбираетесь в данном вопросе, мне очень нужно решить эту проблему с капчей, подозреваю что при установке компонента Jcoments тоже возникнет данная проблема и с любым другим компонентом связанным с отображением CAPTCHA.

Насчет информации в Joomla Информация PHP где именно там надо смотреть, там большой лист информации
если сразу на самом верху то
PHP Version 5.2.4
System    Windows NT MICROSOF-89F309 5.1 build 2600
Build Date    Aug 30 2007 07:05:48
Configure Command    cscript /nologo configure.js "—enable-snapshot-build" "—with-gd=shared"
Server API    Apache 2.0 Handler
Virtual Directory Support    enabled
Configuration File (php.ini) Path    C:WINDOWS
Loaded Configuration File    Z:usrlocalphp5php.ini
PHP API    20041225
PHP Extension    20060613
Zend Extension    220060519
Debug Build    no
Thread Safety    enabled
Zend Memory Manager    enabled
IPv6 Support    enabled
Registered PHP Streams    php, file, data, http, ftp, compress.zlib
Registered Stream Socket Transports    tcp, udp
Registered Stream Filters    convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, zlib.*

дальше там идет Configuration и все остальное, из этого можно понять есть gd2 или нет или надо смотреть еще ниже тоесть в Configuration и дальше.
очень Жду вашего совета capricom.

joomlaforum.ru

Каковы соображения безопасности, когда сервер извлекает файл из ненадежного домена?

Домену (хосту) и файлу не нужно доверять. Это распространяется на два пункта:

  1. Транспорт
  2. Данные

Чтобы безопасно переносить данные, используйте тайм-аут и ограничение по размеру. Современные клиентские библиотеки HTTP предлагают все это. Если файл не может быть запрошен вовремя, отмените соединение. Если файл слишком большой, отбросьте данные. Сообщите пользователю, что возникла проблема с получением файла. В качестве альтернативы, пользователь может передать транспорт на этот сервер, используя браузер пользователей и javascript для получения файла. Затем опубликуйте его. Задайте ограничение по почте своим скриптом.

Пока данные не доверяют, вам необходимо обращаться с ним с осторожностью. Это означает, что вы реализуете сам процесс, который может выполнять различные проверки безопасности в файле, прежде чем вы помечаете его как «безопасный».

Каковы соображения безопасности при изменении размера изображения, которому не доверяют библиотеки PHP GD2?

Затем не передавайте ненадежные данные в библиотеку изображений. См. Вышеприведенный шаг, сначала принесите его в безопасное состояние.

Файл будет сохранен на серверной машине и будет предлагаться для загрузки. Я знаю, что не могу доверять заголовку MIME-Type. Есть ли что-нибудь еще, о чем я должен знать?

Я думаю, что вы все еще в точке выше. Как прийти в безопасное от ненадежного . Конечно, вы не можете доверять заголовку Content-Type, однако хорошо понимать и его.

Вы хотите защитить от уязвимости OWASP, связанной с неограниченной загрузкой файлов .

  1. Проверьте имя файла. Если вы храните данные на своем сервере, дайте ему безопасное временное имя, которое невозможно угадать заранее и недоступное через Интернет.
  2. Проверьте данные, связанные с именем файла, например URL-адрес источника этого файла. Правильно обрабатывайте кодировку.
  3. Бросьте что-нибудь, что не соответствует вашим ожиданиям, поэтому проверьте предварительные условия, которые вы формулируете строго.
  4. Проверяйте данные файла перед продолжением, например, с помощью проверки вирусов.
  5. Подтвердите данные изображения перед продолжением. Это включает в себя файловые заголовки (магические числа), а также то, что размер файла и содержимое файла действительны. Вы должны использовать библиотеку, которая специализировалась на задании, например, файл-файл-формат-исправление ошибок. Это специализированное программное обеспечение, поэтому, если эта часть вашего бизнеса попадает в бизнес. Существует много файлов с кодом свободного программного обеспечения, я оставляю это только для информации, вы ни в коем случае не можете доверять какой-либо рекомендации и должны войти в эту тему.
  6. Если вы планируете самостоятельно изменить размер изображения, вам нужно сделать все в два раза безопаснее, потому что рядом с хостингом вы планируете обрабатывать данные. Поэтому сначала знайте, что вы делаете с данными, чтобы найти потенциальные области проблем.
  7. Ведение журнала и мониторинг.
  8. У вас есть план на случай, что все ошибается.
  9. Подумайте о том, чтобы повторить процесс для уже существующих файлов, поэтому, если вы измените свою процедуру, вы сможете автоматически применять принципы к загрузкам, которые были сделаны и в прошлом.
  10. Создайте систему для каждого типа работы, которая может быть очищена после выполнения работы. Одна система для загрузки, одна система для получения метаданных и т. Д. После каждого действия восстановите систему с изображения. Если отдельные компоненты не работают, они не будут оставлены в эксплуатируемом состоянии. Кроме того, если вы обнаружите ошибку, вы можете отключить всю свою систему, пока не найдете недостаток.

Все это немного зависит от того, сколько вы хотите сделать, но я думаю, вы поняли. Создайте процесс, который работает для вас, зная, где можно улучшить добавление, но сначала создайте инфраструктуру, достаточно модульную для обработки ошибок и которая, вероятно, инкапсулирует процесс, достаточный для решения любого результата.

Вы можете делегировать важные части в систему, о которой вам не нужно заботиться, например, чтобы отделить обработку от хостинга. Кроме того, при размещении изображений веб-сервер не должен быть умным. Чем глупее система, тем менее доступной она (обычно).

Если хостинг не является частью вашего бизнеса, почему бы не передать его амазонке s3 или подобным магазинам? Ваш домен может быть сохранен через настройки DNS.

Храните библиотеки, которые вы используете для проверки изображений с обновлением (подразумевая, что вы знаете, какие библиотеки используются и их versio, например, расширение PHP exif использует mbstring и т. Д. – отслеживает все дерево вниз). Позаботьтесь о том, чтобы вы могли сообщать об ошибках администраторам библиотек полезным способом, например, с протоколированием, хранением данных для воспроизведения и т. Д.

Получите знания о том, какие эксплоиты для изображений существовали в прошлом и какие системы / компоненты / библиотеки ( например, см. Отказ от ответственности ) были затронуты.

Также зайдите в тему, которая является распространенным способом использования чего-то, чтобы собрать основы (я уверен, что вы знаете, однако всегда полезно перечитать некоторые вещи):

  • Безопасная загрузка файлов в веб-приложениях PHP (Alla Bezroutchko, 13 июня 2007 г., PDF)

Некоторые связанные вопросы, в ассортименте:

  • Важно ли проверять, является ли загруженный файл фактическим файлом изображения?
  • PHP-файл загрузки повышает безопасность

ruphp.com

С помощью php можно генерировать изображения ‘на лету’. Для этого есть библиотека GD2. Функционал этой библиотеки очень большой (для сравнения, редактор Paint имеет намного меньше функций). Весь функционал библиотеки лежит в расширении php_gd2_dll, которое подключаем в настройках php.

На сегодня библиотека GD2 поддерживает работу с тремя форматами: GIF, JPEG, PNG.

GIF — это 256-цветный формат, использующий индексированные цвета; его применяют там, где надо мало цветов (графики, например). Этот формат позволяет создать прозрачность цвета и анимацию.

JPEG – полноцветный формат, 16,7 млн. цветов. Формат со сжатием: можно сжимать, уменьшая размер, понижая качество. Сжатие происходит за счет вылета определенной части цвета.

PNG – открытый формат, разработка консорциума W3C. Есть разновидности: png8 — аналог gif, png24 — аналог jpeg без сжатия, png32 — поддерживает прозрачность, слои — сейчас его мало кто использует.

Как обычно происходит работа с картинками? Создается файл, в котором прописывается тег img, но вместо source не картинка, а ссылка на нашу страницу php, которая будет запрошена, запущена, сгенерируется картинка, и вместо html на это место будет посылаться картинка.

<img src="create_image.php">

Бывают ситуации, когда на не нужно отдавать картинку, мы ее просто генерируем и сохраняем у себя на диске. Тогда указываем второй параметр в скобках — имя картинки. Т.е. если есть второй параметр ‘имя’, то картинка не отдается, а сохраняется на диске.

// Генерация JPEG-изображения  header("Content-type: image/jpeg"); //передаем тип файла  imageJpeg($img[,"filename"][,quality]);//передаем ссылку на файл, необязательные параметры - имя картинки, качество  // Генерация GIF-изображения  header("Content-type: image/gif");  imageGif ($img[,"filename"]);  // Генерация PNG-изображения  header("Content-type: image/png");  imagePng($img[,"filename"]);

1st-network.ru

Свойства класса в PHP 5

Раньше в PHP4 все было просто, свойства класса определялись как var, а вот в 5ой версии PHP появилось больше свободы в определение свойств класса. Начнем с оператора public, потому что мы его уже использовали.

Public

Через оператор public мы заявляем открытую, публично доступную переменную класса. Таким образом мы можем менять значение этой переменной в созданном объекте, просто присвоить нужное нам значение, например так:

<?php  $obj = new simpleCMS();   $obj->db='newDB'; ?>

Так мы можем обращаться к переменной объекта, еще раз, потому что переменная была определена как public.

Protected

Оператор protected показывает, что свойство или метод доступно внутри класса или из его производного класса (о наследование и производных классах мы поговорим позже). Если мы определим сейчас свойство db как protected и вызовем это свойство в коде, то это вызовет ошибку:

simpleCMS.php ... protected $db = 'testDB'; ...  index.php ... $obj = new simpleCMS();  $obj->db='newDB'; ...

Давайте теперь добавим защищенную переменную path (путь к файлу), для того чтобы потом использовать ее в методах класса. Но для того чтобы передавать путь к файлу мы будем использовать конструктор.

Конструктор класса

Конструктор класса используется в PHP для того чтобы задать начальное состояние создаваемому объекту, например мы будем задавать путь к файлу для создаваемого объекта изображения. Конструктор записывается как и все остальные методы, в начале его именни два нижних подчеркивания:

class simpleCMS {  protected $path;    public __construct($image){  $this->path = $image;  } }

Таким образом мы передаем путь к файлу через параметр конструктора и записываем в защищенную переменную пути к изображению. Теперь нужно изменить метод public_display для класса simpleCMS, чтобы выводились данные о изображениях.

 if(!empty($row['image_fid'])){ 	$sql = "SELECT * FROM Files WHERE fid=".$row['image_fid']; 	$image_query = mysql_query($sql) or die(mysql_error());  	$image = mysql_fetch_array($image_query); 	$content .= '<div class="image">'; 	 $image = new simpleImage($image['filepath']); 	 $content .= $image->scale(100,100); 	$content .= '</div>'; 	unset($image);  }

Так мы выводим из БД путь к файлу. Теперь, когда мы вывели путь к файлу, давайте писать методы для обработки размеров изображения. Сделаем функции как в друпале:

public function scale($width,$height){  } public function scale_and_crop($width,$height){  }

Давайте начнем с функции масштабирования scale().

public function scale($width, $height){  $path = $this->path; 	$filepath = explode('/',$this->path); //разделим папки и имя файла 	$filename = end($filepath); // забираем последний элемент - имя файла 	$filename = substr($filename, 0, -4); //убираем из имени файла расширение 	$filename = str_replace(' ', '_', $filename); //убираем пробелы из имени файла  $extenstion = substr($this->path, -4); // проверяем расширение файла png, gif, jpg 	 	switch ($extenstion){ 	 case '.png': 	 $srcImage = ImageCreateFromPNG( $path ); 	 break; 	 case '.jpg': 	 $srcImage = ImageCreateFromJPEG( $path ); 	 break; 	 case '.gif': 	 $srcImage = ImageCreateFromGIF( $path ); 	 break; 	 default: 	 $srcImage = ImageCreateFromGIF( $path );  	 break; 	} 	// определяем изначальную высоту и ширину картинки 	$srcWidth = ImageSX( $srcImage ); 	$srcHeight = ImageSY( $srcImage ); 	// следующий код проверяет если ширина больше высоты 	// или высота больше ширины картинки так, чтобы 	// при изменении сохранилась правильная пропорция 	$ratioWidth = $srcWidth/$width; 	$ratioHeight = $srcHeight/$height; 	if( $ratioWidth < $ratioHeight){ 		$destWidth = $srcWidth/$ratioHeight; 		$destHeight = $height; 	}else{ 		$destWidth = $width; 		$destHeight = $srcHeight/$ratioWidth; 	}	 	// создаем новую картинку с конечными данными ширины и высоты 	print $destWidth. '<br />' .$destHeight; 	$destImage = imagecreate( $destWidth, $destHeight); 	// копируем srcImage (исходная) в destImage (конечную) 	ImageCopyResized( $destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight ); 	//создаем jpeg 	imagejpeg( $destImage, 'files/presets/'.$width.'_'.$height.'_'. $filename . '.jpg' ,100 ); //необходимо создать папку presets в папке files 	$newImagePath = 'files/presets/'.$width.'_'.$height.'_'. $filename . '.jpg'; 	// освобаждаем память 	ImageDestroy( $srcImage ); 	ImageDestroy( $destImage );	 	return '<img src="'. $newImagePath . '" width="'. $destWidth.'" height="'. $destHeight . '" />'; // выводим изображение  }

Файлы обработанных изображений мы будем хранить в папке files/presets, нужно чтобы папка presets была создана и на нее были права доступа 777.

Думаю, что я подробно описал алгоритм работы в комментариях, поэтому давайте перейдем к методу scale_and_crop(), правда он мало чем отличается от scale():

public function scale_and_crop($width, $height){  $path = $this->path; 	$filepath = explode('/',$this->path); //разделим папки и имя файла 	$filename = end($filepath); // забираем последний элемент - имя файла 	$filename = substr($filename, 0, -4); //убираем из имени файла расширение 	$filename = str_replace(' ', '_', $filename); //убираем пробелы из имени файла  $extenstion = substr($this->path, -4); // проверяем расширение файла png, gif, jpg 	 	switch ($extenstion){ 	 case '.png': 	 $srcImage = ImageCreateFromPNG( $path ); 	 break; 	 case '.jpg': 	 $srcImage = ImageCreateFromJPEG( $path ); 	 break; 	 case '.gif': 	 $srcImage = ImageCreateFromGIF( $path ); 	 break; 	 default: 	 $srcImage = ImageCreateFromGIF( $path );  	 break; 	} 	// определяем изначальную высоту и ширину картинки 	$srcWidth = ImageSX( $srcImage ); 	$srcHeight = ImageSY( $srcImage ); 	// следующий код проверяет если ширина больше высоты 	// или высота больше ширины картинки так, чтобы 	// при изменении сохранилась правильная пропорция 	$ratioSource = $srcWidth/$srcHeight; 	$ratioNew = $width/$height; 	if( $ratioSource < $ratioNew){ 		$newWidth = $srcWidth; 		$newHeight = $srcHeight / $ratioNew * $ratioSource; // расчитываем новую высоту изображения пропорционально заданной ширине 	}else{ 		$newWidth = $srcWidth / $ratioSource * $ratioNew; // рассчитываем новую ширину изображения пропорционально заданной высоте 		$newHeight = $srcHeight;	 	}	 	// создаем новую картинку с конечными данными ширины и высоты 	$destImage = imagecreate($width, $height); // отличие от scale() 	// копируем srcImage (исходная) в destImage (конечную) 	imagecopyresampled( $destImage, $srcImage, 0, 0, 0, 0, $width, $height, $newWidth, $newHeight); 	//создаем jpeg 	imagejpeg( $destImage, 'files/presets/'.$width.'_'.$height.'_'. $filename . '.jpg' ,100 ); //необходимо создать папку presets в папке files 	$newImagePath = 'files/presets/'.$width.'_'.$height.'_'. $filename . '.jpg'; 	// освобаждаем память 	ImageDestroy( $srcImage ); 	ImageDestroy( $destImage );	 	return '<img src="'. $newImagePath . '" />'; // выводим изображение  } 

Также нужно будет поменять строку вывода в методе display_public():

$content .= '<div class="image">';  $image = new simpleImage($image['filepath']);  $content .= $image->scale_and_crop(100,100); $content .= '</div>';

Таким образом картинки будут квадратными и обрезанными, чтобы соблюдать пропорции.

Как в первом, так и во втором случаях картинки генерировались на лету. Генерация картинок занимает время поэтому обычно пути к коротким картинкам запоминают в БД и выводят сразу эти пути, без повторной генерации изображений.

Мы не будем в этом курсе рассматривать как это делать, потому что в построение своей CMS мы будем использовать Zend framework, а эти уроки PHP в первую очередь должны познакомить вас с основами работы PHP.

drupalbook.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.