» »

Php gd примеры. Работа с изображениями на PHP с использованием GD. c) Создание миниатюры

14.01.2021

9 years ago

Hello there,
i made a function to create a gradient image.

description:
gradient(int image_width, int image_height,
int start_red, int start_green, int start_blue,
int end_red, int end_green, int end_blue,
bool vertical)

function:
function gradient ($image_width , $image_height , $c1_r , $c1_g , $c1_b , $c2_r , $c2_g , $c2_b , $vertical = false )
{
// first: lets type cast;
$image_width = (integer) $image_width ;
$image_height = (integer) $image_height ;
$c1_r = (integer) $c1_r ;
$c1_g = (integer) $c1_g ;
$c1_b = (integer) $c1_b ;
$c2_r = (integer) $c2_r ;
$c2_g = (integer) $c2_g ;
$c2_b = (integer) $c2_b ;
$vertical = (bool) $vertical ;

// create a image
$image = imagecreatetruecolor ($image_width , $image_height );

// make the gradient
for($i = 0 ; $i < $image_height ; $i ++)
{
$color_r = floor ($i * ($c2_r - $c1_r ) / $image_height )+ $c1_r ;
$color_g = floor ($i * ($c2_g - $c1_g ) / $image_height )+ $c1_g ;
$color_b = floor ($i * ($c2_b - $c1_b ) / $image_height )+ $c1_b ;

$color = ImageColorAllocate ($image , $color_r , $color_g , $color_b );
imageline ($image , 0 , $i , $image_width , $i , $color );
}

# Prints out all the figures and picture and frees memory
header ("Content-type: image/png" );

if($vertical ){ $image = imagerotate ($image , 90 , 0 );}
ImagePNG ($image );
imagedestroy ($image );
}
?>

7 years ago

In case your script is using output-buffering-functions somewhere, then you have to clear the buffer first (with ob_clear()), before outputting an image with a function like imagepng().

And you should make sure that no buffer will get send after outputing an image by using the ob_end_flush()-function.

Furthermore you should check if a buffer has already been flushed somewhere before. This can be done using the headers_sent()-function.

Here is the full solution:

if(headers_sent ()){
die("Headers have been send somewhere within my script" );
}

Ob_clean (); //Clears the buffer

Header ("Content-type: image/png" );
imagepng ($img , NULL , 0 , NULL );

Ob_end_flush (); //Now we send the header and image plus we make sure that nothing will get send from now on (including possible shutdown-functions and __destruct()-methods) till the end of page-execution
?>

10 years ago

You know, maybe this goes without saying, but I thought I would drop a note in here. When developing code to resize images, it is best not to use GD. When using the current GD methodologies, you are reading content from an image and manipulating it. By then writing that content to a brand new file, you are losing the EXIF data.

For purposes when you want to retain EXIF data, it is recommended that you compile in and use the PECL Imagick extension. It has great resizing methods built right in and the EXIF data is retained.

10 years ago

I have been looking to send the output from GD to a text string without proxying via a file or to a browser.

I have come up with a solution.

This code buffers the output between the ob_start() and ob_end() functions into ob_get_contents()

See the example below

// Create a test source image for this example
$im = imagecreatetruecolor (300 , 50 );
$text_color = imagecolorallocate ($im , 233 , 14 , 91 );
imagestring ($im , 1 , 5 , 5 , "A Simple Text String" , $text_color );

// start buffering
ob_start ();
// output jpeg (or any other chosen) format & quality
imagejpeg ($im , NULL , 85 );
// capture output to string
$contents = ob_get_contents ();
// end capture
ob_end_clean ();

// be tidy; free up memory
imagedestroy ($im );

// lastly (for the example) we are writing the string to a file
$fh = fopen ("./temp/img.jpg" , "a+" );
fwrite ($fh , $contents );
fclose ($fh );
?>

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

§1. Общие принципы

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

Для валидации картинки по URL мы будем использовать функцию getimagesizefromstring() , т. к. cURL скачает её в переменную для дальнейших манипуляций.

Поскольку мы загружаем изображения на сервер, то хорошо было бы проверять их определённые параметры: ширину , высоту , тип картинки, размер файла в байтах. Это зависит от логики вашего приложения, но для наглядности в этом руководстве мы проверим все вышеописанные параметры.

§2. Правила безопасности

Безопасность загрузки изображений сводится к недопущению попадания на сервер чужеродного кода и его выполнения. На практике загрузка картинок наиболее уязвимое место в PHP-приложениях: попадание shell-скриптов , запись вредоносного кода в бинарные файлы , подмена EXIF-данных . Для того, чтобы избежать большинства методов взлома нужно придерживаться следующих правил:

а не доверять данным из $_FILES;
б не проверять MIME-тип картинки из функции getimagesize();
в загружаемому файлу генерировать новое имя и расширение;
г запретить выполнение PHP-скриптов в папке с картинками;
д не вставлять пользовательские данные через require и include;
е для $_FILES использовать is_uploaded_file() и move_uploaded_file().

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

§3. Конфигурация php.ini

PHP позволяет внести определённые конфигурационные значения в процесс загрузки любых файлов. Для этого необходимо в файле php.ini найти блоки «Resource Limits », «Data Handling » и «File Uploads », а затем отредактировать, по необходимости, следующие значения:

; Максимальное время выполнения скрипта в секундах max_execution_time = 60 ; Максимальное потребление памяти одним скриптом memory_limit = 64M ; Максимально допустимый размер данных отправляемых методом POST post_max_size = 5M ; Разрешение на загрузку файлов file_uploads = On ; Папка для хранения файлов во время загрузки upload_tmp_dir = home/user/temp ; Максимальный размер загружаемого файла upload_max_filesize = 5M ; Максимально разрешённое количество одновременно загружаемых файлов max_file_uploads = 10

Исходя из указанных значений, пользователь не сможет за один раз загрузить больше десяти файлов, причём каждый файл не должен превышать 5 Мбайт. Параметры из блока «Resource Limits » больше нужны для загрузки удалённого файла, т. к. с помощью cURL мы будем скачивать содержимое в переменную и проверять её по нужным нам критериям, а для этого необходимо дополнительное время и память.

Конфигурационный файл php.ini всегда необходимо настраивать согласно бизнес-логики разрабатываемого веб-приложения. Например, мы планируем загружать не более десяти файлов до 5 Мбайт, а это значит нам понадобиться ~50 Мбайт памяти. Кроме того, нам нужно знать максимальное время загрузки одного файла с локальной машины и по ссылке, дабы установить достаточное время выполнения скрипта в max_execution_time и не пугать пользователей ошибками.

§4. Загрузка картинок из формы

Сейчас мы не будем рассматривать загрузку нескольких файлов на сервер, а разберём лишь саму механику загрузки на примере одного файла. Итак, для загрузки картинки с компьютера пользователя необходимо с помощью HTML-формы отправить файл PHP-скрипту методом POST и указать способ кодирования данных enctype="multipart/form-data" (в данном случае данные не кодируются и это значение применяется только для отправки бинарных файлов). С формой ниже мы будем работать дальше:

Для поля выбора файла мы используем имя name="upload" в нашей HTML-форме, хотя оно может быть любым. После отправки файла PHP-скрипту file-handler.php его можно перехватить с помощью суперглобальной переменной $_FILES["upload"] с таким же именем, которая в массиве содержит информацию о файле:

Array ( => picture.jpg // оригинальное имя файла => image/jpeg // MIME-тип файла => home\user\temp\phpD07E.tmp // бинарный файл => 0 // код ошибки => 17170 // размер файла в байтах )

Не всем данным из $_FILES можно доверять: MIME-тип и размер файла можно подделать, т. к. они формируются из HTTP-ответа, а расширению в имени файла не стоит доверять в силу того, что за ним может скрываться совершенно другой файл. Тем не менее, дальше нам нужно проверить корректно ли загрузился наш файл и загрузился ли он вообще. Для этого необходимо проверить ошибки в $_FILES["upload"]["error"] и удостовериться, что файл загружен методом POST с помощью функции is_uploaded_file() . Если что-то идёт не по плану, значит выводим ошибку на экран.

// Перезапишем переменные для удобства $filePath = $_FILES ["upload" ]["tmp_name" ]; $errorCode = $_FILES ["upload" ]["error" ]; // Проверим на ошибки if ($errorCode !== UPLOAD_ERR_OK || ! is_uploaded_file ($filePath )) { // Массив с названиями ошибок $errorMessages = [ UPLOAD_ERR_INI_SIZE => "Размер файла превысил значение upload_max_filesize в конфигурации PHP." , UPLOAD_ERR_FORM_SIZE => "Размер загружаемого файла превысил значение MAX_FILE_SIZE в HTML-форме." , UPLOAD_ERR_PARTIAL => "Загружаемый файл был получен только частично." , UPLOAD_ERR_NO_FILE => "Файл не был загружен." , UPLOAD_ERR_NO_TMP_DIR => "Отсутствует временная папка." , UPLOAD_ERR_CANT_WRITE => "Не удалось записать файл на диск." , UPLOAD_ERR_EXTENSION => "PHP-расширение остановило загрузку файла." , ]; // Зададим неизвестную ошибку $unknownMessage = "При загрузке файла произошла неизвестная ошибка." ; // Если в массиве нет кода ошибки, скажем, что ошибка неизвестна $outputMessage = isset ($errorMessages [$errorCode ]) ? $errorMessages [$errorCode ] : $unknownMessage ; // Выведем название ошибки die ($outputMessage ); }

Для того, чтобы злоумышленник не загрузил вредоносный код встроенный в изображение, нельзя доверять функции getimagesize() , которая также возвращает MIME-тип. Функция ожидает, что первый аргумент является ссылкой на корректный файл изображения . Определить настоящий MIME-тип картинки можно через расширение FileInfo . Код ниже проверит наличие ключевого слова image в типе нашего загружаемого файла и если его не окажется, выдаст ошибку:

// Создадим ресурс FileInfo $fi = finfo_open (FILEINFO_MIME_TYPE); // Получим MIME-тип $mime = (string) finfo_file ($fi , $filePath ); );

На данном этапе мы уже можем загружать абсолютно любые картинки на наш сервер, прошедшие проверку на MIME-тип, но для загрузки изображений по определённым характеристикам нам необходимо валидировать их с помощью функции getimagesize() , которой скормим сам бинарный файл $_FILES["upload"]["tmp_name"] . В результате мы получим массив максимум из 7 элементов :

Array ( => 1280 // ширина => 768 // высота => 2 // тип => width="1280" height="768" // аттрибуты для HTML => 8 // глубина цвета => 3 // цветовая модель => image/jpeg // MIME-тип )

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

// Результат функции запишем в переменную $image = getimagesize ($filePath ); $limitBytes = 1024 * 1024 * 5 ; $limitWidth = 1280 ; $limitHeight = 768 ; // Проверим нужные параметры if (filesize ($filePath ) > $limitBytes ) die ("Размер изображения не должен превышать 5 Мбайт." ); if ($image > $limitHeight ) die (); if ($image > $limitWidth ) die ();

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

// Сгенерируем новое имя файла на основе MD5-хеша $name = md5_file ($filePath ); // Сократим.jpeg до.jpg // Переместим картинку с новым именем и расширением в папку /pics if (! move_uploaded_file ($filePath , __DIR__ . "/pics/" . $name . $format )) { die ("При записи изображения на диск произошла ошибка." ); }

На этом загрузка изображения завершена. Для более удобной загрузки файлов можете использовать класс UploadedFile из пакета Symfony HttpFoundation , который является обёрткой для $_FILES и также сохраняет файл через move_uploaded_file() .

§5. Загрузка изображения по ссылке

Для загрузки изображения по ссылке нам понадобиться библиотека cURL , которая работает с удалёнными ресурсами. С помощью неё мы скачаем контент в переменную. С одной стороны может показаться, что для этих целей подойдёт file_get_contents() , но на самом деле мы не сможем контролировать объём скачиваемых данных и нормально обрабатывать все возникшие ошибки. Для того, чтобы cURL корректно скачал данные нам нужно: разрешить следовать перенаправлениям , включить проверку сертификата , указать максимальное время работы cURL (формируется за счёт объёма скачиваемых данных и средней скорости работы с ресурсом). Как правильно скачать файл в переменную показано ниже с необходимыми параметрами :

// Каким-то образом получим ссылку $url = "https://site.ru/picture.jpg" ; // Проверим HTTP в адресе ссылки if (! preg_match ("/^https?:/i" , $url ) && filter_var ($url , FILTER_VALIDATE_URL)) { die ("Укажите корректную ссылку на удалённый файл." ); } // Запустим cURL с нашей ссылкой $ch = curl_init ($url ); // Укажем настройки для cURL curl_setopt_array ($ch , [ // Укажем максимальное время работы cURL CURLOPT_TIMEOUT => 60 , // Разрешим следовать перенаправлениям CURLOPT_FOLLOWLOCATION => 1 , // Разрешим результат писать в переменную CURLOPT_RETURNTRANSFER => 1 , // Включим индикатор загрузки данных CURLOPT_NOPROGRESS => 0 , // Укажем размер буфера 1 Кбайт CURLOPT_BUFFERSIZE => 1024 , // Напишем функцию для подсчёта скачанных данных // Подробнее: http://stackoverflow.com/a/17642638 CURLOPT_PROGRESSFUNCTION => function ($ch , $dwnldSize , $dwnld , $upldSize , $upld ) { // Когда будет скачано больше 5 Мбайт, cURL прервёт работу if ($dwnld > 1024 * 1024 * 5 ) { return - 1 ; } }, // Включим проверку сертификата (по умолчанию) CURLOPT_SSL_VERIFYPEER => 1 , // Проверим имя сертификата и его совпадение с указанным хостом (по умолчанию) CURLOPT_SSL_VERIFYHOST => 2 , // Укажем сертификат проверки // Скачать: https://curl.haxx.se/docs/caextract.html CURLOPT_CAINFO => __DIR__ . "/cacert.pem" , ]); $raw = curl_exec ($ch ); // Скачаем данные в переменную $info = curl_getinfo ($ch ); // Получим информацию об операции $error = curl_errno ($ch ); // Запишем код последней ошибки // Завершим сеанс cURL curl_close ($ch );

Если всё прошло успешно и cURL уложился в 60 секунд, тогда содержимое по ссылке будет скачано в переменную $raw . Кроме того, функция curl_getinfo() вернёт информацию о проделанном запросе, откуда мы можем получить дополнительную информацию для анализа работы с удалёнными ресурсами:

Array ( => image/jpeg // MIME-тип из Content-Type => 200 // последний HTTP-код => 0 // количество перенаправлений => 0.656 // общее время работы cURL => 0.188 // время на соединение с хостом => 4504 // реальный размер полученных данных => 4504 // размер данных из Content-Length /* ... */ )

Дальше нам нужно проверить нет ли ошибок в curl_errno() и удостовериться, что ресурс отдаёт HTTP-код равный 200, иначе мы скажем, что по такому-то URL ничего не найдено. После всех проверок переменную $raw передаём в getimagesizefromstring() и работаем уже по отработанной схеме как в случае с загрузкой картинок из формы.

Обратите внимание, что мы валидируем размер файла в момент получения данных, т. к. мы не можем на 100% доверять curl_getinfo(), поскольку значения content_type, http_code, download_content_length формируются на основе полученных HTTP-заголовков. Скачивать файл полностью, а потом проверять количество байт потребует много времени и памяти. Поэтому мы контролировали размер получаемых данных с помощью опции CURLOPT_PROGRESSFUNCTION: как только cURL получит больше данных, чем наш лимит, он прекратит работу и выдаст ошибку CURLE_ABORTED_BY_CALLBACK.

// Проверим ошибки cURL и доступность файла if ($error === CURLE_OPERATION_TIMEDOUT) die ("Превышен лимит ожидания." ); if ($error === CURLE_ABORTED_BY_CALLBACK) die ("Размер не должен превышать 5 Мбайт." ); if ($info ["http_code" ] !== 200 ) die ("Файл не доступен." ); // Создадим ресурс FileInfo $fi = finfo_open (FILEINFO_MIME_TYPE); // Получим MIME-тип используя содержимое $raw $mime = (string) finfo_buffer ($fi , $raw ); // Закроем ресурс FileInfo finfo_close ($fi ); // Проверим ключевое слово image (image/jpeg, image/png и т. д.) if (strpos ($mime , "image" ) === false ) die ("Можно загружать только изображения." ); // Возьмём данные изображения из его содержимого $image = getimagesizefromstring($raw ); // Зададим ограничения для картинок $limitWidth = 1280 ; $limitHeight = 768 ; // Проверим нужные параметры if ($image > $limitHeight ) die ("Высота изображения не должна превышать 768 точек." ); if ($image > $limitWidth ) die ("Ширина изображения не должна превышать 1280 точек." ); // Сгенерируем новое имя из MD5-хеша изображения $name = md5 ($raw ); // Сгенерируем расширение файла на основе типа картинки $extension = image_type_to_extension ($image ); // Сократим.jpeg до.jpg $format = str_replace ("jpeg" , "jpg" , $extension ); // Сохраним картинку с новым именем и расширением в папку /pics if (! file_put_contents (__DIR__ . "/pics/" . $name . $format , $raw )) { die ("При сохранении изображения на диск произошла ошибка." ); }

Для сохранения изображения на диск можно воспользоваться file_put_contents() , которая запишет контент в файл. Новое имя файла мы создадим через функцию md5() , а расширение сделаем из image_type_to_extension() . Теперь мы можем загружать любые картинки по ссылке.

§6. Настройка выбора нескольких файлов

В этом параграфе разберём способы загрузки нескольких изображений за один раз с локальной машины пользователя и по удалённым ссылкам. Для отправки ссылок мы задействуем $_POST и передадим ей все данные с помощью тега textarea . Для загрузки файлов из формы мы продолжим дальше работать с $_FILES . Наша новая HTML-форма будет немного отличаться от старой.

В конец имени поля выбора файла name="upload" добавились фигурные скобки и аттрибут multiple , который разрешает браузеру выбрать несколько файлов. Все файлы снова загрузятся во временную папку, если не будет никаких ошибок в php.ini . Перехватить их можно в $_FILES , но на этот раз суперглобальная переменная будет иметь неудобную структуру для обработки данных в массиве. Решается эта задача небольшими манипуляциями с массивом:

// Изменим структуру $_FILES foreach ($_FILES ["upload" ] as $key => $value ) { foreach ($value as $k => $v ) { $_FILES ["upload" ][$k ][$key ] = $v ; } // Удалим старые ключи unset ($_FILES ["upload" ][$key ]); } // Загружаем все картинки по порядку foreach ($_FILES ["upload" ] as $k => $v ) { // Загружаем по одному файлу $_FILES ["upload" ][$k ]["tmp_name" ]; $_FILES ["upload" ][$k ]["error" ]; }

Для загрузки нескольких картинок по URL передадим наши ссылки через textarea с именем name="upload" , где их можно указать через пробел или с новой строки. Функция preg_split разберёт все данные из $_POST["upload"] и сформирует массив, по которому нужно пройтись циклом и каждый валидный URL отправить в обработчик.

$data = preg_split ("/\s+/" , $_POST ["upload" ], - 1 , PREG_SPLIT_NO_EMPTY); foreach ($data as $url ) { // Валидируем и загружаем картинку по URL }

Интернет будет довольно скучным без изображений. Тем не менее, поддержка и управление сотнями или тысячами изображений для вашего веб-сайта может быть головной болью. По мере изменения дизайна вашего сайта вам может потребоваться изменить все ваши изображения - например, преобразовать все ваши изображения в оттенки серого или изменить их размер до 50% от их первоначального размера. Вы также можете сжимать или обрезать разные изображения. Выполнение этого вручную занимает много времени и подвержено ошибкам, но с небольшим знанием программирования оно может быть автоматизировано.

В этом уроке мы узнаем о библиотеке GD (Graphic Draw) в PHP. Вы увидите, как эту библиотеку можно использовать для управления изображениями путем изменения размера, обрезки, поворота или фильтрации.

Что такое GD?

PHP может сделать гораздо больше, чем просто отправлять HTML-сообщения посетителям. Например, он имеет возможность манипулировать изображениями. Не только это, но вы также можете создавать свои собственные изображения с нуля, а затем либо сохранять их, либо подавать их пользователям.

PHP может удовлетворить практически все ваши основные потребности в управлении изображениями, используя библиотеку GD - сокращение для Graphic Draw.

Установка

Если вы работаете в Windows, вы можете включить файл php_gd2.dll в качестве расширения в php.ini . Если вы используете что-то вроде XAMPP, вы найдете файл php_gd2.dll в каталоге xampp\php\ext . Вы также можете проверить, установлена ли GD в вашей системе, с помощью функции phpinfo(); . Если вы просмотрите полученный результат, вы найдете что-то похожее на следующее.

Вы также можете посетить страницу требований и установки , чтобы узнать больше об установке.

Создание изображений с помощью PHP GD

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

Создание нового изображения

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

Загрузка файла изображения

Если вы планируете работать с изображениями, которые уже хранятся где-то, вам пригодится использование таких функций, как imagecreatefromjpeg() , imagecreatefrompng() и imagecreatefromgif() . Они создадут ресурс изображения со всеми данными из загруженного файла изображения. Эти функции принимают единственный параметр, который указывает местоположение загружаемого изображения, как URL-адрес или путь к файлу.

Создание изображения из строки

Библиотека GD также позволяет создавать изображения из строки, используя функцию imagecreatefromstring() в PHP. Помните, что вам нужно будет использовать base64_decode() для данной строки перед imagecreatefromstring() . Функция может автоматически определять, является ли тип изображения JPG, PNG, GIF или другим поддерживаемым форматом.

Вращение, масштабирование, обрезка и переворот изображения

Некоторые общие операции, которые вы можете выполнять на ресурсе изображения, - это вращение, масштабирование, обрезка и переворот.

Вращение

Вы можете повернуть изображение, которое вы уже загрузили в скрипт, используя функцию imagerotate() . Она будет вращать изображение под заданным углом, используя центр изображения в качестве центра вращения. Угол представлен как значение с плавающей точкой, и PHP считает, что это значение угла вращения. Иногда повернутое изображение будет иметь разные размеры по сравнению с исходной версией. Это означает, что после поворота вы получите некоторую открытую область. Третий параметр функции imagerotate() может использоваться для задания цвета фона пустой области после вращения.

Масштабирование

Очень просто масштабировать изображение с помощью библиотеки GD. Вам просто нужно передать ресурс изображения, а также ширину и высоту в функцию imagescale() . Если вы опустите высоту, GD будет масштабировать изображение до указанной ширины, сохраняя соотношение сторон. Вы также можете указать режим масштабирования изображения. Его можно установить в IMG_NEAREST_NEIGHBOUR , IMG_BILINEAR_FIXED , IMG_BICUBIC и т.д. Важная вещь, которую вам нужно запомнить, это то, что эта функция возвращает новый источник масштабированного изображения вместо того, чтобы изменять исходный.

Обрезка

Вы можете обрезать любой ресурс изображения с помощью функции imagecrop() в GD. Первый параметр - исходный ресурс изображения, а второй параметр - ассоциативный массив с ключами x , y , width и height , определяющий размеры позиции окна обрезки.

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

$im_php = imagecreatefromjpeg("path/to/image"); $size = min(imagesx($im_php), imagesy($im_php)); $im_php = imagecrop($im_php, ["x" => $size*0.4, "y" => 0, "width" => $size, "height" => $size]); $im_php = imagescale($im_php, 300);

В основном, мы сохраняем длину самой маленькой стороны в переменной $size . Затем эта переменная используется для определения границы нашего прямоугольника обрезки. Наконец, изображение уменьшено таким образом, что оно составляет всего 300 пикселей в ширину и длину. Это дает нам квадратное изображение.

Переворот изображений

Изображения можно перевернуть горизонтально, вертикально или в обоих направлениях с помощью функции imageflip() . Она принимает ресурс изображения, который вы хотите перевернуть, в качестве первого параметра, и режим переворота в качестве второго параметра. Режим переворота может быть установлен на IMG_FLIP_HORIZONTAL , IMG_FLIP_VERTICAL или IMG_FLIP_BOTH .

Верхнее левое изображение на приведенном выше рисунке является оригиналом. Верхнее правое изображение было создано с помощью IMG_FLIP_HORIZONTAL , нижнее левое изображение было создано с использованием IMG_FLIP_VERTICAL , а нижнее правое изображение - с помощью IMG_FLIP_BOTH . (Изображение вороны от Pixabay .)

Применение фильтров к изображению

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

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

  • IMG_FILTER_NEGATE: обращает (меняет как в негативе) цвета на изображении
  • IMG_FILTER_GRAYSCALE: удаляет цвет из изображения
  • IMG_FILTER_BRIGHTNESS: делает изображение ярче или темнее
  • IMG_FILTER_CONTRAST: увеличивает контрастность изображения
  • IMG_FILTER_COLORIZE: оттеняет изображение в выбранный цвет
  • IMG_FILTER_EDGEDETECT: выделяет края изображения
  • IMG_FILTER_EMBOSS: похоже на обнаружение краев, но придает каждому краю приподнятый вид
  • IMG_FILTER_GAUSSIAN_BLUR: размывает изображение с использованием метода Гаусса
  • IMG_FILTER_SELECTIVE_BLUR: размывает изображение с помощью выборочного метода
  • IMG_FILTER_MEAN_REMOVAL: эффект создания стилизованного изображения
  • IMG_FILTER_SMOOTH: сглаживает зубчатые края изображения
  • IMG_FILTER_PIXELATE: делает изображение пикселизированным

Некоторые фильтры, такие как NEGATE , GRAYSCALE , EDGE_DETECT и EMBOSS , не нуждаются в дополнительных данных. Другие фильтры, такие как BRIGHTNESS , CONTRAST и SMOOTH , могут принимать дополнительный параметр, который определяет количество яркости, контрастности или гладкости конечного изображения. Параметр PIXELATE позволяет указать два дополнительных параметра: размер блока, а также режим пикселизации. Наконец, фильтр COLORIZE принимает четыре параметра, которые определяют значения для red, green и blue компонентов, а также альфа-канала.

Изображение в левом верхнем углу является оригиналом. Верхнее правое изображение было создано с использованием фильтра COLORIZE , нижний левый был создан с использованием фильтра GRAYSCALE , а изображение в правом нижнем углу было создано с использованием фильтра BRIGHTNESS . (Это изображение бабочки было найдено в Pixabay .)

Другие полезные функции для работы с изображениями

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

Получение размеров изображения

Вы можете определить ширину и высоту ресурса изображения с помощью функций imagesx() и imagesy() .

Другая функция, называемая getimagesize() , также может использоваться для получения ширины и высоты изображения вместе с его типом. Эта функция возвращает массив с элементами, определяющими ширину, высоту и формат изображения. Первые два элемента массива описывают ширину и высоту, а третий элемент содержит константу, определяющую формат файла: один из IMAGETYPE_PNG , IMAGETYPE_GIF и т.д.

Сохранение изображения

После того, как вы внесете все необходимые изменения в изображение, вы, скорее всего, захотите либо вывести его в браузер, либо сохранить его как файл. В любом случае вам придется использовать одну из функций вывода GD, таких как imagejepg() , imagepng() или imagegif() . Вы передадите свой ресурс изображения одной из этих функций вывода, и если вы хотите сохранить изображение в файл, вы также укажете имя файла. Вы также можете управлять качеством выходного изображения с помощью третьего необязательного параметра в зависимости от типа изображения.

Изменение размера всех изображений в каталоге

Давайте применим на практике полученные нами знания, чтобы сделать что-нибудь. В этом разделе мы изменим размер всех изображений JPEG в определенном каталоге на ширину 640 пикселей. Высота будет рассчитываться автоматически в зависимости от размеров исходного изображения.

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

$directory = "Nature/"; $images = glob($directory."*.jpg"); foreach($images as $image) { $im_php = imagecreatefromjpeg($image); $im_php = imagescale($im_php, 640); $new_height = imagesy($im_php); $new_name = str_replace("-1920x1080", "-640x".$new_height, basename($image)); imagejpeg($im_php, $directory."Resized/".$new_name); }

В приведенном выше коде мы начнем с использования функции glob() , чтобы найти все изображения с расширением .jpg в каталоге под названием Nature . Файлы изображений хранятся в массиве, и мы поочередно перебираем их.

Поскольку все изображения, которые мы хотим изменить, являются JPEG, мы используем функцию imagecreatefromjpeg() , чтобы загрузить их в скрипт. Затем используется функция imagescale() для изменения размера изображения до определенной ширины - 640 пикселей в нашем случае. Мы не указали фиксированную высоту, чтобы высота была рассчитана автоматически.

К каждому из исходных файлов изображений было добавлено -1920x1080 к их имени файла, чтобы указать его размеры. Мы используем str_replace() в исходном имени файла и заменяем -1920X1080 на новый размер изображения.

Наконец, мы сохраняем измененные изображения в папке с именем Resize с новыми именами файлов. Вы также можете передать третий параметр функции imagejpeg() , чтобы установить качество сохраненного файла изображения. Если третий параметр опущен, изображения сохраняются с качеством по умолчанию 75.

Применение оттенков серого и контрастных фильтров для каждого изображения в каталоге

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

$directory = "Nature/"; $images = glob($directory."*.jpg"); foreach($images as $image) { $im_php = imagecreatefromjpeg($image); imagefilter($im_php, IMG_FILTER_GRAYSCALE); imagefilter($im_php, IMG_FILTER_CONTRAST, -25); $new_name = basename($image); imagejpeg($im_php, $directory."Grayscale/".$new_name); }

Как вы можете видеть, мы загружаем изображения из каталога Nature так же, как и в предыдущем примере. Однако на этот раз мы будем использовать функцию imagefilter() для применения фильтров на загруженном ресурсе изображения.

Обратите внимание, что imagefilter() изменяет исходное изображение и возвращает TRUE или FALSE в зависимости от успеха или провала операции. Это отличается от функции imagescale() , которую мы использовали в предыдущем разделе, которая вернула масштабированный ресурс изображения.

Еще одна важная вещь, которую следует иметь в виду, заключается в том, что контрастный фильтр принимает значения от -100 до 100. Отрицательные значения подразумевают большую контрастность, а положительные значения означают меньший контраст. Это противоположно тому, что могут ожидать некоторые люди! Значение 0 оставляет изображение неизменным.

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

Мы получаем имя файла из пути файла, используя функцию basename() , а затем сохраняем изображение с помощью функции imagejpeg() .

Заключительные мысли

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

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

В статье описывается работа с расширением PHP - GDLib, которое позволяет динамически формировать изображения на Web-страницах.
Автор - Nykoh (Нико)
Перевод с французского - Антон Федорченко
Адрес оригинала - http://www.phpdebutant.org/article111.php

Для понимания этой статьи необходимо иметь представление об элементарных основах PHP, а также работе с изображениями.

Примечание переводчика

в примерах все названия идентификаторов даны на французском языке. Для того, чтобы облегчить читателю понимание кода, мы предлагаем их перевод:
blanc - белый
bleu - голубой
couleur - цвет
couleur_fond - цвет фона
fichier - файл
gris - серый
hauteur – высота
hauteurimage - высота изображения
largeur – ширина
largeurimage – ширина изображения
mois - месяц
noir - черный
police – гарнитура шрифта
rouge – красный
tableau - массив
vert - зеленый

Примечание переводчика

По умолчанию в PHP 5 все расширения отключены, в том числе и расширение для формирования динамических изображений - GD. За инструкцией по настройки данного расширения, следует обратится к статье

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

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

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

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

phpinfo.php

phpinfo ();
?>

Если у вас появится таблица похожая на эту – все нормально (особенно если версия библиотеки новее, чем 2.0)

GD

GD Support

GD Version

FreeType Support

FreeType Linkage

JPG Support

PNG Support

WBMP Support

Как было упомянуто выше, некоторые возможности могут быть отключены. В таком случае следует просто попробовать использовать ту или иную функцию. Если это приведет к ошибке: Fatal error : Call to undefined function, - у вас не должно быть никаких сомнений, что данная функция отключена.

I) Создание холста

Для начала необходимо создать пустой холст. Сразу поясним, что в данной статье мы будем рассказывать исключительно об изображениях в формате PNG или JPG, формат GIF останется без нашего внимания. Дело в том, что этот формат перестал поддерживаться библиотекой GD, начиная с версии 1.3, правда ограниченная поддержка GIF появилась опять в версии 2. Вывод: формат PNG – выгодная альтернатива GIF

Важное замечание

Во всех учебных курсах сайта www.phpdebutant.org, скрипты имели целью динамическое создание html-страниц. На этот раз, используя библиотеку GD, мы создаем изображения, поэтому в данном случае вы должны забыть на время конструкции echo и print. По умолчанию PHP-скрипт генерирует html-страницу, что не требует уточнения в виде отправки особого http-заголовака. Но если мы создаем изображение, в самом начале скрипта необходимо указать его тип, отправкой соответствующего заголовка, например для PNG: header ("Content-type: image/png");

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

imagevide.php

header ("Content-type: image/png" );
$im = ImageCreate (200 , 100 )
or die ();
$couleur_fond = ImageColorAllocate ($im , 255 , 0 , 0 );
ImagePng ($im );
?>

Этот небольшой скрипт генерирует красный прямоугольник (очень скромное, но хорошее начало). Описание механизма:

  • Функция ImageCreate возвращает дескриптор $im. Дескриптор $im должен передаваться всем функциям прорисовки изображения. Параметры функции ImageCreate соответствуют длине и ширине создаваемого изображения (200х100).
  • Задача оператора or die – перехват возможных ошибок.
  • Создать цвет можно при помощи функции ImageColorAllocate. Она используется для
    • создания цвета и его сохранение в переменной с целью последующего использования
    • добавление цвета в палитру изображения $im

Ее параметры соответствуют красной, зеленой и синей компонентам цвета и представляют из себя целые числа от 0 до 255. В этом примере мы создали красный цвет.

Важное замечание

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

Вызов скрипта imagevide.php (пустое_изображение.php) создаст изображение в формате PNG. Для того, чтобы его использовать на web-сайте, нужно действовать так же, как и в случае с "классическими" изображениями.

Совсем несложно! Вы даже можете передавать параметры скрипту, который будет генерировать изображение (например цвет фона).

Итак, вы уже обладаете некоторыми базовыми знаниями для того, чтобы начать рисовать. Если вам хочется их углубить - вот несколько интересных функций

  • Вы можете заменить ImageCreate на ImageCreateTrueColor, чтобы создать 32 битное изображение (идеально для фотографий)
  • Вы можете заменить ImagePng функцией ImageJPEG чтобы создать изображение в формате JPEG (не забудьте поменять параметр функции header на header("Content-type: image/jpeg").
  • Ниже мы увидим, что сгенерированное изображение можно сохранить

II) Функции прорисовки изображения

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

Например, для изображения с разрешением 100 на 200 пикселей координаты будут такими:

Различные функции прорисовки изображения принимают в качестве параметров его координаты. Приучайтесь передавать их в требуемом порядке. Так, например, для того, чтобы нарисовать прямоугольник, необходимо передать координаты двух точек соответствующей функции (ImageRectangle). Координаты первой точки соответствуют верхнему левому углу изображения, координаты второй точки соответствуют нижнему правому углу. Не путайте аргументы, поскольку некоторые функции могут выдать ошибочные результаты.


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

Пример синтаксиса

Описание

Создает пустой холст (256 цветов) $im высотой $largeur и шириной $hauteur. (формат PNG предпочтителен)

Эта функция похожа на ImageCreate но глубина цвета изображения не ограничена 256 цветами. (формат JPEG предпочтителен)

Помещает в переменную $col цвет компонентами которого являются $rouge, $vert, $bleu (диапазон 0 .. 255).Подробности см. в первой части.

Создает эллипс на изображении $im с центром в точке ($x,$y), шириной $l, высотой $h и цветом $col.

Идентична ImageEllipse, но эллипс заполняется цветом $col

Создает на изображении $im прямоугольник цвета $col, расположенный между точкой с координатами ($x,$y) и нижним правым углом изображения цвета $col

Рисует линию цвета $col, которая проходит между двумя точками с координатами ($x1,$y1) и ($x2,$y2)

На изображении $im рисует многоугольник, координаты которого перечислены в массиве $points ($points=$x0, $points=$y0, $points=$x1, $points=$y1, и т. д.), $num_points – количество точек в массиве, $col - цвет.

Идентична ImagePolygo, но эллипс заполняется цветом $col

На изображении $im рисует прямоугольник, верхний левый угол которого имеет координаты ($x0, $y0) , а правый нижний ($x1, $y1). $col – цвет прямоугольника

Идентична ImageRectangle, но эллипс заполняется цветом $col

Эти функции позволяют изменить стиль прочерчиваемых линий. Для более подробной информации посмотрите официальную документацию, особенно обратите внимание на пример использования функции ImageSetStyle , который также является показательным для функции ImageSetBrush

В изображении $im рисует точку с координатами ($x,$y) и цветом $col

Меняет толщину линий, созданных различными функциями.

В изображении $im создает строку $chaine с координатами (левый верхний угол) ($x,$y) цвета $col $police - размер (гарнитура) шрифта (от 0 до 5)

Идентична ImageString , но строка выводится вертикально

III) Пример первый: статистика посещений сайта в виде графика

Чтобы применить полученные знания на практике – создадим простой скрипт-пример. Часто требуется представить статистику посещения сайта в форме гистограммы

Мы предполагаем, что вы уже разработали ту часть скрипта, которая отвечает за учет посетителей (возможно с использованием таблицы MySQL). Об ее реализации мы говорить здесь не будем, это не цель данной статьи. Допустим, что статистика посещений за каждый месяц помещена в массив $visites. В этой статье мы наполняем массив "вручную", но вы можете сделать это сами, используя данные вашей таблицы MySQL.

a) Статистика посещений: создание изображения и цвета

Начнем с создания массива, который содержит в себе статистику посещений сайта за 12 месяцев (12 элементов). Затем сгенерируем картинку разрешением 400х300 и создадим три цвета, один из которых (белый) будет цветом фона.

visites.php

$visites = array(138 , 254 , 381 , 652 , 896 , 720 , 140 , 556 , 663 , 331 , 407 , 768 );

Header ("Content-type: image/png" );
$largeurImage = 400 ;
$hauteurImage = 300 ;
$im = ImageCreate ($largeurImage , $hauteurImage )
or die ("Ошибка при создании изображения" );

$noir = ImageColorAllocate ($im , 0 , 0 , 0 );
$bleu = ImageColorAllocate ($im , 0 , 0 , 255 );
?>

b) Рисуем оси графика

Поместим горизонтальную ось времени (простая черная линия) в нижнюю часть изображения, оставив поле в 10 пикселов.

Внизу подписываем номер каждого из 12 месяцев, используя цикл for и функцию ImageString. Номера месяцев располагаются через каждые 30 пикселов, начиная с левой стороны изображения.

Наконец, проводим вертикальную линию, ось ординат статистики посещений.

// проводим горизонтальную линию, ось абсцисс (время)
ImageLine ($im, 10, $hauteurImage-10, $largeurImage-10, $hauteurImage-10, $noir);
// выводим порядковый номер каждого из 12 месяцев
for ($mois=1; $mois ImageString ($im, 0, $mois*30, $hauteurImage-10, $mois, $noir);
}

// проводим вертикальную линию, чтобы ось ординат (число посещений)
ImageLine ($im, 10, 10, 10, $hauteurImage-10, $noir);
?>

c) Рисуем палочки

Теперь переходим к более сложной задаче – рисованию палочек.

Для начала нам необходимо узнать максимальное число посетителей, которое мы представим на графике. Здесь мы выбрали случайное значение – 1000, но на самом деле вам, наверное, придется его вычислять, осуществляя запрос на максимальное значение столбца вашей таблицы MySQL. Мы же сделаем проще…

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

Нам остается только прорисовать каждый прямоугольник, начиная с координат его верхнего левого угла и кончая нижним правым.

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

// максимум посещений
$visitesMax = 1000 ;

// рисуем палочки
for ($mois = 1 ; $mois <= 12 ; $mois ++) {
$hauteurImageRectangle = round (($visites [ $mois - 1 ]* $hauteurImage )/ $visitesMax );
ImageFilledRectangle ($im , $mois * 30 - 7 , $hauteurImage - $hauteurImageRectangle , $mois * 30 + 7 , $hauteurImage - 10 , $bleu );
ImageString ($im , 0 , $mois * 30 - 7 , $hauteurImage - $hauteurImageRectangle - 10 , $visites [ $mois - 1 ], $noir );
}

// вот и все
ImagePng ($im );
?>

d) А вот и результат!

Результат, конечно, не назовешь превосходным, но следует учитывать, что нам удалось сделать что-то более или менее презентабельное, написав всего 20 строчек простого кода, что само по себе уже неплохо.

Гистограмма посещаемости по 12 месяцам.


IV) Другие полезные функции

Вот еще один набор полезных функций, предназначенных для управления цветовой палитрой, а также для получения различной информации об изображениях.

Описание

"Это функция использует в качестве параметра имя файла $fichier и возвращает массив, содержащий 4 элемента: (1) $tableau ширина изображения (px), (2) $tableau высота изображения (px), (3) $tableau тип изображения (см. документацию), (4) $tableau возвращает строку, которую можно вставить в тег IMG (width=""1024"" height=""768"")"

Области изображения $im, прорисованные цветом $col становятся прозрачными. Чтобы сохранить прозрачность, используйте формат PNG

Копируем прямоугольную область изображения $src_im на изображение $dst_im. Область копирования ограничена координатами точки верхнего левого угла($src_x, $src_y), шириной $src_l и высотой $src_h. Скопированная область появляется в изображении-реципиенте в точке с координатами. ($dst_x, $dst_y)

Идентична ImageCopy, в добавок к этому функция осуществляет постепенный переход тонов интенсивностью $intensite, которая принимает значения от 1 до 100.

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

Идентична ImageCopyResampled, но результат масштабирования менее четок, зато функция работает быстрее.

Возвращает идентификатор ресурса, $im, указывающий на изображение, которое находится в файле формата jpeg $fichier.

Возвращает идентификатор ресурса, $im, указывающий на изображение, которое находится в файле формата png $fichier.

Возвращает ширину изображения $im

Возвращает высоту изображения $im

V) Пример второй: генерация миниатюр (уменьшенных копий изображения)

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

a) Начало

В отличие от первого примера, данный скрипт будет записывать изображение в файл, а не генерировать его на лету. Поэтому необходимость в отправке особого http-заголовка при помощи функции header() отпадает. Таким образом, скрипт становится "классическим" и может генерировать html.

Начнем с создания пустого холста размером 200х150, затем считаем существующее изображение (из файла) при помощи функции ImageCreateFromJpeg. Потом нам также могут понадобится размеры изображения-источника, для этого мы воспользуемся imagesx и imagesy.

miniature.php

$fichierSource = "photo3.jpg" ;

$largeurDestination = 200 ;
$hauteurDestination = 150 ;
$im = ImageCreateTrueColor ($largeurDestination , $hauteurDestination )
or die ("Ошибка при создании изображения" );

$source = ImageCreateFromJpeg ($fichierSource );

$largeurSource = imagesx ($source );
$hauteurSource = imagesy ($source );
?>

b) Рамка

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

Существует простой способ создания подобной рамки, который заключается в прорисовке нескольких разноцветных прямоугольников, вложенных один в другой. Начинаем с самого большого прямоугольника темного цвета (его размер совпадает с размерами изображения). Затем на него накладываем другой меньший по размерам прямоугольник, цвет которого будет более светлым и т.д.

Толщина создаваемой нами рамки – 8 пикселов.

$blanc = ImageColorAllocate ($im , 255 , 255 , 255 );
$gris [ 0 ] = ImageColorAllocate ($im , 90 , 90 , 90 );
$gris [ 1 ] = ImageColorAllocate ($im , 110 , 110 , 110 );
$gris [ 2 ] = ImageColorAllocate ($im , 130 , 130 , 130 );
$gris [ 3 ] = ImageColorAllocate ($im , 150 , 150 , 150 );
$gris [ 4 ] = ImageColorAllocate ($im , 170 , 170 , 170 );
$gris [ 5 ] = ImageColorAllocate ($im , 190 , 190 , 190 );
$gris [ 6 ] = ImageColorAllocate ($im , 210 , 210 , 210 );
$gris [ 7 ] = ImageColorAllocate ($im , 230 , 230 , 230 );

For ($i = 0 ; $i <= 7 ; $i ++) {
ImageFilledRectangle ($im , $i , $i , $largeurDestination - $i , $hauteurDestination - $i , $gris [ $i ]);
}
?>

c) Создание миниатюры

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

  • ($im) Изображение-реципиент
  • ($source) Изображение-источник
  • Координата х области изображения-реципиента, на которую накладывается изображение-копия.
  • Координата y
  • Координата х копируемой области изображения-источника (0 если мы хотим скопировать все изображение)
  • Координата (y)
  • Ширина копии, которая вставляется на изображение-источник ($largeurDestination-(2*8) ширина изображения-реципиента минус ширина рамки справа и слева).
  • Высота копии (проделываем те же операции, что и с шириной)
  • Ширина копируемой области изображения-источника
  • , $hauteurSource );
    ImageString ($im , 0 , 12 , $hauteurDestination - 18 , " $fichierSource - ($largeurSource x $hauteurSource )" , $blanc );
    ?>

    d) Сохранение результата.

    Нам остается только сохранить полученный результат в файле, имя которого начинается с mini_. Это мы сделаем при помощи функции ImageJpeg.
    Когда эта функция имеет только один параметр, изображение выводится в браузер пользователя. Однако если в качестве второго параметра передается имя файла, никакого вывода в браузер не произойдет, а картинка будет сохранена в указанном файле. То же правило действует для функции ImagePng

    Мое изображение не выводится, браузер ведет себя так, как будто изображение не существует.
    Скорее всего ошибку следует искать в вашем скрипте. Сделайте комментарий из строки header("Content-type: image/png") (или header("Content-type: image/jpeg")), а также из строки ImagePng($im) (илиImageJpeg($im)), чтобы получить сообщение об ошибке

    Скрипт долго выполняется на моем хостинге, это нормально?
    Если вы используйте "тяжеловесные" функции как ImageCopyResampled, это неудивительно. У интерпретатора PHP, установленного на хостинге, и без этого работы хватает…

    Цвета моего изображения искажены (или оно выводится как черно-белое), почему?
    Скорее всего вы использовали функцию ImageCreate, которая ограничивает цветовую палитру 256 цветами. Чтобы преодолеть это ограничение используйте функцию ImageCreateTrueColor вместо ImageCreate.

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

    Результат


Создание пустой картинки.

Синтаксис:

Int imageCreate(int x, int y)

Создает пустую картинку размером x на y точек и возвращает ее идентификатор. После того, как картинка создана, вся работа с ней осуществляется именно через этот идентификатор, по аналогии с тем, как мы работаем с файлом через его дескриптор.

Пример:

Создание новой картинки при помощи GD и вывод ее в экран браузера:

imageCreateFromPng

Создание рисунка из файла PNG.

Синтаксис:

Int imageCreateFromPng(string filename)

Эта функция загружают изображения из файла PNG в память и возвращает его идентификатор. Как и после вызова imageCreate()

Пример:

Пример нахождения ошибки при открытии графического файла.

Function LoadPNG ($imgname) { $im = @imagecreatefrompng ($imgname); /* Attempt to open */ if (!$im) { /* See if it failed */ $im = imagecreate (150, 30); /* Create a blank image */ $bgc = imagecolorallocate ($im, 255, 255, 255); $tc = imagecolorallocate ($im, 0, 0, 0); imagefilledrectangle ($im, 0, 0, 150, 30, $bgc); /* Output an errmsg */ imagestring ($im, 1, 5, 5, "Error loading $imgname", $tc); } return $im; }

imageCreateFromJpeg

Создание рисунка из файла JPEG.

Синтаксис:

Int imageCreateFromJpeg(string filename)

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

imageCreateFromGif

Создание рисунка из файла GIF.

Синтаксис:

Int imageCreateFromGif(string filename)

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

Стоит упомянуть, что GD начиная с версии 1.6 не поддерживает формат GIF. В связи с этим данная функция практически не используется.

imagePng

Функция выводит изображение в PNG-формате в любой браузер или в файл.

Синтаксис:

Int imagePng(int im [, string filename])

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

imageCreate() im .

Если аргумент filename Content-type Header() .

Header("Content-type: image/png") для PNG.

Пример: Пример использования функции imagepng() :

Для сохранения alpha-канала исходного изображения необходимо применять функцию imagesavealpha() :

imageJpeg

Отсылка рисунка JPEG браузеру или сохранение его в файле.

Синтаксис:

Int imageJPEG(int im [, string filename [, int quality]])

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

Разумеется, вначале изображение должно быть загружено или создано при помощи функции imageCreate() , т.е. мы должны знать его идентификатор im .

Если аргумент filename опущен, то сжатые данные в соответствующем формате выводятся прямо в стандартный выходной поток, т.е. в браузер. Нужный заголовок Content-type при этом не выводится, ввиду чего нужно выводить его вручную при помощи Header() .

Фактически, вы должны вызвать одну из трех команд, в зависимости от типа изображения:

Header("Content-type: image/jpeg") для Jpeg

Третий необязательный параметр quality задает качество изображения (от 0 до 100).

image2WBMP

Вывод изображения в браузер или файл.

Синтаксис:

Int image2WBMP(resource image [, string filename [, int threshold]])

Функция выводит изображение, заданное дескриптором image , в браузер, либо в файл, имя которого задано необязательным параметром filename .

Если изображение выводится в браузер, необходимо задать его тип WBMP как image/vnd.wap.wbmp функцией Header() :

Функция image2WBMP() доступна PHP только если версия библиотеки GD 1.8 или ниже.

imageGif

Отсылка рисунка GIF браузеру или сохранение его в файле.

Синтаксис:

Int imageGIF(int im [, string filename])

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

Разумеется, вначале изображение должно быть загружено или создано при помощи функции imageCreate() , т.е. мы должны знать его идентификатор im .

Если аргумент filename опущен, то сжатые данные в соответствующем формате выводятся прямо в стандартный выходной поток, т.е. в браузер. Нужный заголовок Content-type при этом не выводится, ввиду чего нужно выводить его вручную при помощи Header() .

Фактически, вы должны вызвать одну из трех команд, в зависимости от типа изображения:

Header("Content-type: image/gif")

Т.к. библиотека GD , начиная с версии 1.6, не поддерживает формат GIF, данная функция используется редко.

imageCopy

Копирование части рисунка.

Синтаксис:

Int imageCopy(int dst_im, int src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h)

Функция копирует прямоугольную область начиная с позиции (src_x , src_y ) шириной src_w и высотой src_h из рисунка src_im в рисунок dst_im , придав копируемой области смещение (dst_x , dst_y ).

В следующем примере будет картинка file1.png целиком скопирована в file2.png

imageCopyResized

Копирование части рисунка с масштабированием.

Синтаксис:

Int imageCopyResized(int dst_im, int src_im, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)

Эта функция - одна из самых мощных и универсальных. С помощью нее можно копировать изображения (или их участки), перемещать или масштабировать их.

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

src_im - идентификатор изображения, над которым проводится работа. Впрочем, src_im и dst_imмогут и совпадать.

Параметры srcX , srcY , srcW , srcH задают область внутри исходного изображения, над которой будет осуществлена операция - соответственно, координаты ее верхнего левого угла, ширину и высоту.

Наконец, четверка dstX , dstY , dstW , dstH задает то место на изображении dst_im , в которое будет "втиснут" указанный в предыдущей четверке прямоугольник. Заметьте, что, если ширина или высота двух прямоугольников не совпадают, то картинка автоматически будет нужным образом растянута или сжата.

В следующем примере файл file1.jpg уменьшается вдвое и записывается в файл file2.jp g:

imageDestroy

Уничтожение рисунка.

Синтаксис:

Int imageDestroy(int im)

Функция уничтожает дескриптор im ранее созданного рисунка (наподобие закрытия файла fclose() после открытия fopen() ).