- imagecreatefrompng
- Parameters
- Return Values
- Changelog
- Examples
- User Contributed Notes 7 notes
- Загрузка изображений на сервер и изменение размера изображения на PHP
- Немного теории по загрузке изображений на сервер средствами PHP
- Подготовка
- Проверки
- Изменение размеров изображений PHP
- Вызов функции
- Конечный результат
- Послесловие
- Домашнее задание
imagecreatefrompng
imagecreatefrompng() returns an image identifier representing the image obtained from the given filename.
A URL can be used as a filename with this function if the fopen wrappers have been enabled. See fopen() for more details on how to specify the filename. See the Supported Protocols and Wrappers for links to information about what abilities the various wrappers have, notes on their usage, and information on any predefined variables they may provide.
Parameters
Return Values
Returns an image object on success, false on errors.
Changelog
Version | Description |
---|---|
8.0.0 | On success, this function returns a GDImage instance now; previously, a resource was returned. |
Examples
Example #1 Example to handle an error during loading of a PNG
function LoadPNG ( $imgname )
/* Attempt to open */
$im = @ imagecreatefrompng ( $imgname );
?php
/* See if it failed */
if(! $im )
/* Create a blank image */
$im = imagecreatetruecolor ( 150 , 30 );
$bgc = imagecolorallocate ( $im , 255 , 255 , 255 );
$tc = imagecolorallocate ( $im , 0 , 0 , 0 );
imagefilledrectangle ( $im , 0 , 0 , 150 , 30 , $bgc );
/* Output an error message */
imagestring ( $im , 1 , 5 , 5 , ‘Error loading ‘ . $imgname , $tc );
>
header ( ‘Content-Type: image/png’ );
imagepng ( $img );
imagedestroy ( $img );
?>
The above example will output something similar to:
User Contributed Notes 7 notes
If you’re trying to load a translucent png-24 image but are finding an absence of transparency (like it’s black), you need to enable alpha channel AND save the setting. I’m new to GD and it took me almost two hours to figure this out.
$imgPng = imageCreateFromPng ( $strImagePath );
imageAlphaBlending ( $imgPng , true );
imageSaveAlpha ( $imgPng , true );
/* Output image to browser */
header ( «Content-type: image/png» );
imagePng ( $imgPng );
?>
I had the same problem as jboyd1189 at yahoo dot com but I solve d it allocating more memory dynamically.
Usually the memory_limit var on php.ini is set to 8M. Unfortunately, the required amount of memory to manage a PNG image about 1000×1000 could be bigger !
The approach I used to solve the problem is:
1-Calculate the memory required by the image
2-Set the new memory_limit value
3-Create the PNG image and thumbnail
4-Restore the original value
1-The following value works for me:
$required_memory = Round($width * $height * $size[‘bits’]);
2-Use somthing like:
$new_limit=memory_get_usage() + $required_memory;
ini_set(«memory_limit», $new_limit);
Because gd and imagick do not support animated PNG (at this moment), i wrote a simple function to determine if given PNG is APNG or not. It does not validate PNG, only checks whenever «acTL» chunk appears before «IDAT» like the specification says: https://wiki.mozilla.org/APNG_Specification
function is_apng ( string $filename ): bool
$f = new \ SplFileObject ( $filename , ‘rb’ );
$header = $f -> fread ( 8 );
if ( $header !== «\x89PNG\r\n\x1A\n» ) return false ;
>
while (! $f -> eof ()) $bytes = $f -> fread ( 4 );
if ( strlen ( $bytes ) < 4 ) return false ;
>
$length = unpack ( ‘N’ , $bytes )[ 1 ];
$chunkname = $f -> fread ( 4 );
switch ( $chunkname ) case ‘acTL’ :
return true ;
case ‘IDAT’ :
return false ;
>
$f -> fseek ( $length + 4 , SEEK_CUR );
>
return false ;
>
When using imagecreatepng with alpha blending you will lose the blending.
To over come this use something like the following
$dstimage = imagecreatetruecolor ( $width , $height );
$srcimage = imagecreatefrompng ( $src );
imagecopyresampled ( $dstimage , $srcimage , 0 , 0 , 0 , 0 , $width , $height , $width , $height );
?>
Where $width and $height are the width and height of the $src image.
This will create a true colour image then copy the png image to this true colour image and retain alpha blending.
Загрузка изображений на сервер и изменение размера изображения на PHP
Сегодня я хочу рассказать о реализации довольно популярной задачи. Во-первых, это загрузка изображения на сервер. А во-вторых, это изменение размера изображения. Также рассмотрим поворот и изменение качества.
Немного теории по загрузке изображений на сервер средствами PHP
Вы не можете сразу загрузить файл в свою папку. Вначале он загружается во временную директорию сервера, а затем обрабатывается с помощью PHP интерпритатора. По окончанию сессии временный файл автоматически удаляется. То есть, мы вначале забрасываем файл во временную папку, а затем перекладываем в нужную.
$_FILES это массив загруженных файлов. Он имеет параметры (на примере файла picture):
$_FILES[‘ picture ‘][‘name’] – настоящее имя файла. Например: image.jpg.
Онлайн курс «PHP-разработчик»
Изучите курс и создайте полноценный проект — облачное хранилище файлов
С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.
$_FILES[‘ picture ‘][‘size’] – размер файла в байтах.
$_FILES[‘ picture ‘][‘type’] – MIME-тип загруженного файла. Например: image/gif, image/png, image/jpeg.
$_FILES[‘ picture ‘][‘tmp_name’] – содержит имя файла во временном каталоге, например: /tmp/phpV3b3qY. Именно этот параметр и используется для перемещения файлов после загрузки.
$_FILES[‘ picture ‘][‘error’] – код ошибки.
Подготовка
Для начала нам нужна форма для загрузки. Возьмём простейшую форму.
Параметр enctype=»multipart/form-data» обязателен для такой формы. Тег отвечает за поле для ввода имени файла, который загружается на сервер.
Также нам потребуется обработчик события – загрузки файла. Вначале у нас будет одна настройка – путь сохранения изображения. Можно указывать как прямой, так и относительный путь. В случае POST запроса обработчик попробует осуществить загрузку файла по указанному пути. Скрипт сообщит о результате загрузки – удачна она или нет.
Функция copy, как вы наверно догадались, отвечает за копирование файла из одного место в другое. Мы копируем файл из временной папки сервера в нужную, сохранив имя файла.
Договоримся, что и форма и её обработчик будут находиться в одном файле – upload.php.
Итого имеем простой, но рабочий скрипт. Его можно забросить на хостинг, создать папку i и потренироваться с загрузкой файлов.
Проверки
Любая форма представляет для сайта опасность. И особенно форма загрузки файлов. Злоумышленник может загрузить скрипт и выполнить его на сервере. Поэтому необходимо озаботиться безопасностью.
Самые простые и обязательные проверки – на размер и тип файла. Для этого укажем допустимые типы и размер.
Тип файла укажем в виде массива:
Проверяем тип файла. В случае недопустимого типа прекращаем работу скрипта и выводим соответствующее уведомление. Функция in_array проверяет присутствие значения в массиве.
Проверяем размер файла. В случае недопустимого размера прекращаем работу скрипта и выводим соответствующее уведомление.
Итого получаем такой скрипт. Скрипт рабочий, можно баловаться. Немного забегая вперёд, добавим также параметр $tmp_path – путь к папке временных файлов.
Изменение размеров изображений PHP
Приступим к самому интересному, а именно изменению размеров изображения с помощью PHP. Для этого напишем функцию resize. Сделаем также возможным изменять качество изображения и поворачивать его.
Размер изображения будем подставлять исходя из параметра. Это будет либо эскиз ($type = 1), либо большое изображение ($type = 2).
Итак, шапка функции у нас получилась такая:
По умолчанию подставляем размеры эскиза, а поворот и качество по умолчанию не используются. Пойдём дальше.
Устанавливаем ограничение размера изображения по ширине. Функцию можно сделать более абстрактной, если задавать эти значения в параметрах, а также сделать возможным ограничение и по высоте. Однако в данном случае нам не нужна такая универсальность.
Устанавливаем качество изображения по умолчанию (при $quality = null) равным 75%.
Далее создаём изображение для дальнейших преобразований. Для создания используем функцию в зависимости от типа файла (jpg, png или gif). Функции создания называются очень лаконично imagecreatefrom + тип файла.
Если указан параметр $rotate, выполняем поворот изображения. Делаем это с помощью функции rotate(), параметрами которой являются: изображение, градусы, фон изображения для закрашивания пустых областей, образованных при повороте. Для того чтобы пустые области не возникали, поворачиваем изображение на угол в 90, 180, 270 градусов.
Далее определяем высоту и ширину изображения с помощью функций imagesx и imagesy.
В зависимости от типа (эскиз или большое изображение) устанавливаем ограничение по ширине.
Далее, если ширина изображения больше максимальной, проводим преобразования. Иначе просто сохраняем изображение и очищаем память. Сохраняем изображение с помощью функции imagejpeg. В данном примере, рассмотрено сохранение только в формате jpg, однако функционал всегда можно расширить. Удаляем изображения из памяти с помощью функции imagedestroy.
В качестве результата работы функции возвращаем имя файла. Оно нам ещё понадобится.
Вернёмся к преобразованию. Вначале вычисляем пропорции изображения и размеры преобразованного изображения.
Далее создаём пустую картинку (функция imagecreatetruecolor) с шириной и высотой, полученными на прошлом шаге.
И копируем исходное изображение ($src) в только что созданное ($dest), изменяя его размеры. Функция imagecopyresampled делает это с пересэмплированием, что улучшает качество.
И наконец, сохраняем полученное изображение и очищаем память.
Итого, функция получает исходное изображение и параметры преобразования, выполняет преобразования, сохраняет полученный файл во временную папку и возвращает имя изображения. Теперь нам осталось только переложить файл в конечную папку.
Отвечу заранее на вопрос «Почему мы не можем сразу положить изменённый файл в конечную папку?». Можем. Однако не делаем для увеличения глубины абстракции, то есть, чтобы придать определённую универсальность функции. Вы же сможете её использовать на разных сайтах.
Совсем забыл. Добавляем в начало функции строку:
Она обозначает, что в функции будет использована глобальная переменная $tmp_path – путь к временной папке.
Вызов функции
Функцию нужно вызывать сразу после проверок. А также следует изменить ту часть скрипта, где мы копируем изображение в конечную папку. Вы ведь теперь работаем с новым изображением. Теперь схема загрузки такова: компьютер → временная папка сервера → наша временная папка → конечная папка. То есть, добавился ещё один промежуточный пункт.
Для пущего веселья добавим в нашу форму выпадающий список, чтобы мы устанавливать тип загрузки и поля для ввода градуса поворота.
В таком случае вызов функции будет такой:
Конечный результат
И наконец, конечный результат.
Послесловие
Естественно, рассмотренный пример учебный. Однако он вполне рабочий. Что вы можете попробовать, забросив скрипт на сервер и создав папки для изображений и временных файлов. Скрипт можно бесконечно дорабатывать, изменять уровень абстракции, добавлять условия и параметры, преобразования, проверки, накладывать «водяной знак».
Идеальный вариант – осмыслить и допилить до своих требований.
Домашнее задание
Конечно, задание проверять никто не будет. Однако я рекомендую его выполнить для себя. Ведь программирование – это, прежде всего, практика. Итак:
Вынесите размеры эскиза ($max_thumb_size) и большого изображения ($max_size) из функции в настройки файла.
Попробуйте задавать их в параметрах функции. Это значительно повысит уровень абстракции.
Проработайте вариант, когда изображение ограничивается по большей стороне, а не только по ширине.
Попробуйте получить на выходе файл того же типа, что и исходный. То есть, например, если загружаете gif, то и уменьшенная копия будет gif.
Попробуйте генерировать и эскиз и большой файл за одну загрузку.
Попробуйте наложить «водяной знак».
Используя бонусный код, добавьте в функцию возможность создания квадратных файлов. Добавьте в форму выбор типа обрезки – квадратная или пропорциональная.
P.S. Если вы захотите генерировать не пропорциональное изображение, а вырезать серединку и делать квадратную картинку, вам поможет этот код. Вставить его в функцию resize вы должны сами. Уверен, что у вас получится.