Что такое код imagecreatetruecolor

imagecreatetruecolor

(PHP 4 >= 4.0.6, PHP 5)

imagecreatetruecolor — Create a new true color image

Описание

imagecreatetruecolor() returns an image identifier representing a black image of the specified size.

Depending on your PHP and GD versions this function is defined or not. With PHP 4.0.6 through 4.1.x this function always exists if the GD module is loaded, but calling it without GD2 being installed PHP will issue a fatal error and exit. With PHP 4.2.x this behaviour is different in issuing a warning instead of an error. Other versions only define this function, if the correct GD version is installed.

Список параметров

Возвращаемые значения

Returns an image resource identifier on success, FALSE on errors.

Примеры

Пример #1 Creating a new GD image stream and outputting an image.

Результатом выполнения данного примера будет что-то подобное:

Примечания

Замечание: Эта функция нуждается в GD версии 2.0.1 или выше.

Смотрите также

  • imagedestroy() — Destroy an image
  • imagecreate() — Create a new palette based image

ImageLine, imagecreatetruecolor не работает должным образом

Я пытаюсь использовать библиотеку изображений GD, но безуспешно. Все коды, которые я пробовал, всегда показывают одно и то же маленькое пустое изображение. Я уже проверил и GD включен. Права доступа к папкам установлены на 777 на всякий случай. Я использую:

ОС: Mac El Capitan,
Сервер: MAMP,
Версия PHP: 7.0.10.

Любая помощь приветствуется.

Решение

Я переместил код в верхнюю часть страницы, и он работает. Я не знаю, почему он не работает внутри HTML, возможно, заголовок? Хм, я раньше только перемещал заголовок, но он все еще не работал. Я должен прочитать больше о библиотеке в любом случае.

Что такое код imagecreatetruecolor

При разработке любого сайта или веб-приложения нужно делать его максимально устойчивым к различным ситуациям, особенно если со стороны пользователя поступают какие-либо данные. Одна из таких ситуаций — обработка фотографий или других изображений, загружаемых пользователем. Для ресайза, наложения водяных знаков или эффектов, так или иначе приходится вызывать функцию ImageCreateTrueColor. Эта операция требует много памяти. Особенно это критично на виртуальном хостинге, где очень часто аккаунт жестко ограничен в использовании памяти сервера. Если памяти не хватает, например, для обработки больших изображений или в случае применения «бомб», то скрипт падает с фатальной ошибкой. Как узнать объем памяти, который потребуется для работы с изображением, до вызова функции ImageCreateTrueColor? Ответ вы найдете в этой статье.

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

im->tpixels=(int **) gdMalloc(sizeof(int *) * sy);
im->AA_opacity=(unsigned char **) gdMalloc(sizeof(unsigned char *) * sy);
for (i = 0; i tpixels[i]=(int *) gdCalloc(sx,sizeof(int));
im->AA_opacity[i]=(unsigned char *) gdCalloc(sx,sizeof(unsigned char));
>

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

Размер необходимой памяти = sy*sizeof(int *) + sy*sizeof(char *) + sy*sx*sizeof(int) + sy*sx*sizeof(char)
В человекопонятном виде это будет выглядеть вот так:

Размер необходимой памяти = sy*8 + sy*8 + sy*sx*4 + sy*sx*1
Вспоминаем школьный курс арифметики:

Размер необходимой памяти = sy*16 + sy*sx*5
Осталось реализовать все это в виде функции. Она получает объем памяти, которую уже занял PHP, прибавляет к ней рассчитанный размер памяти для изображения и сравнивает с параметром memory_limit из настроек PHP. Расширение GD работает в контексте PHP, поэтому попадает под это ограничение.

  1. function chk_memory ( $x , $y ) <
  2. // Доступная память для PHP
  3. $memory_available = intval ( ini_get ( ‘memory_limit’ ))* 1000 * 1000 ;
  4. // Подсчет необходимой памяти для обработки изображения
  5. $memory_needed = memory_get_usage ()+( $y * 16 + $x * $y * 5 );
  6. return ( $memory_available > $memory_needed );
  7. >
Илон Маск рекомендует:  Как сделать кнопку внутри поля для поиска

Эту же функцию можно использовать для проверки доступной памяти перед вызовом функций ImageCreateFrom*. Определяем размеры изображения, передаем их в функцию и сразу же узнаем, сможем ли мы обработать этот файл. Больше не будет никаких фатальных ошибок из-за переполнения памяти.

А как быть, если все равно требуется обработка больших изображений? Для этого придется использовать средства ImageMagick. ImageMagick работает вне контекста PHP и на него не распространяются лимиты памяти.

Imagecreate VS Imagecreatetruecolor

Для тех кто читал официальную документацию PHP php.net/imagecreate по функции imagecreate библиотеки GD на первый взгляд все ясно: раз в место нее рекомендуется использовать imagecreatetruecolor, зачить так тому и быть. Да и количество цветов обрабатываемое каждой из функций GD, явно говорит в пользу imagecreatetruecolor(). Но вот в случае работы с GIF изображениями, предпочтительнее всеже применять imagecreate().

Изображение формата GIF может содержать максимум 256 цветов, что вполне по силам Imagecreate(). А вот если сравнить кол-во памяти, требуемое каждой из функций на создание одного и того-же изображения, то весы явно склоняются не в пользу imagecreatetruecolor():

$memory = memory_get_usage ( ) ;
$width = 500 ;
$height = 500 ;

$img = imagecreate ( $width , $height ) ;
echo ‘Память, используемя для imagecreate(): ‘ . ( memory_get_usage ( ) — $memory ) . ‘ байт.
‘ ;
imagedestroy ( $img ) ;

$img = imagecreatetruecolor ( $width , $height ) ;
echo ‘Память, используемя для imagecreatetruecolor(): ‘ . ( memory_get_usage ( ) — $memory ) . ‘ байт.
‘ ;
imagedestroy ( $img ) ;

Результат теста, код которого приведен выше, впечатляет: imagecreate потребляет 536 064 байт оперативной памяти, imagecreatetruecolor — в два раза больше: 1 284 192 байт! Использование imagecreate() может весьма существенно снизить потребление памяти сервера у проэкта, активно использующего работу с изображениями.

Применение imagecreate() из библиотеки PHP GD не сводится только к экономии памяти. С помощью этой функции получается создать изображение формата gif с прозрачными участками без артефактов (три прямоугольных прозрачных участка, идущих по линии снизу слева до верхнего правго угла примера ниже). Пример изображений, с залитым желтым фоном средствами HTML, чтобы лучше была видна разница в фотографиях (черные линии по краям прозрачных областей, качество самой фотографии):

Фотографии специально увеличены (w > img > ) до размера 550 на 344 (оригинал 300 на 188). При внимательном изучении можно найти множество отличий в качестве фотографий, размер которых был изменен с помощью этого кода, написанного на PHP с использованием функций GD:

$img_path = ‘http://obovsem.org.ua/img/all/articles/24/prev_les.gif’ ;
// Если фотография не загружается, скопируйте ее на свой сервер и смените путь $img_path
$tmp = getimagesize ( $img_path ) ;
$new_width = 299 ;
$new_height = 187 ;
$original_width = $tmp [ 0 ] ;
$original_height = $tmp [ 1 ] ;

$img_src = imagecreatefromgif ( $img_path ) ;
$new_img = imagecreate ( $new_width , $new_height ) ;
//$new_img = imagecreatetruecolor($new_width, $new_height);
$color = imagecolorallocate ( $new_img , 0 , 0 , 0 ) ;
imagecolortransparent ( $new_img , $color ) ;
imagecopyresampled ( $new_img , $img_src , 0 , 0 , 0 , 0 , $new_width , $new_height , $original_width , $original_height ) ;
header ( «Content-type: image/gif» ) ;
imagegif ( $new_img ) ;
imagedestroy ( $img_src ) ;
imagedestroy ( $new_img ) ;

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

Функция Imagecreatetruecolor

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

Параметр Width являет собой ширину изображения.

Параметр Height должен содержать высоту изображения соответственно.

Функция Imagecreatetruecolor возвращает ресурс изображения в случае успеха, или FALSE в случае ошибки.

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

“call to undefined function imagecreatetruecolor” error in PHP & pChart

I am trying to integrate «pChart» with my PHP code. When I am trying to run the samples it gives me an error stating call to undefined function imagecreatetruecolor . The suggestion solution was to load this dll «php_gd2.dll» so I have uncommented extension=php_gd2.dll in php.ini file.

Илон Маск рекомендует:  Что такое код odbc_primarykeys

Even after that I get the same error. I have tried restarting the server & machine too.

6 Answers 6

Use the following code to test if you have GD extension:

If you get the message that it’s not installed, then check the following steps:

  1. phpinfo() and look up php.ini path
  2. edit php.ini : extension_dir=
  • edit php.ini : extension=php_gd2.dll //uncomment or add
  • Restart web server
  • Run the test script again
  • In Ubuntu/Linux Mint Platform (under root), use the following command:

    I met this problem just now. You should exec sudo apt install php7.0-gd or vim your php.ini reopen extension=php_gd2.dll

    I have same error:

    and my solution was this:

    edit file php.ini and uncomment line content «extension=gd.so«, save and try again

    This answer is an update 9 years later, but PHP has changed a lot. Please upvote the St. Woland from which this is derived.

    Use the following code on your web server to test if you have GD extension:

    «; //display GD function list

    If you get the message that it’s not installed, then check the following steps:

    1. Look at the output of phpinfo() to identify your php.ini
    2. Edit php.ini and enable the GD extension:
      • Newer PHP (7.3, fg):
        • extension=gd2 //uncomment
      • Older PHP (5.x, 7.0, you should upgrade):
        • extension_dir=

    //uncomment or add

  • extension=php_gd2.dll //uncomment or add
  • GD for 7.x may not be installed
    • (for Ubuntu like OS’es) sudo apt install php7.3-gd # replace version to yours
  • Restart web server
  • Run the test script again
  • (Remove test script when all is working, it can be a security hole)
  • As you can see the exact method is very version dependent. I hope this additional information can help others sort out the exact steps they might need.

    IntSystem.org

    Случаи из опыта разработки различных WEB проектов. Интересные факты, статьи, впечатления. Программирование и все о нем в сфере WEB.

    Правильный ресайз прозрачных картинок на PHP

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

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

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

    Как всем известно, в вебе обычно используется три формата изображений: PNG, GIF, JPEG. Соответственно прозрачными могут быть только PNG и GIF. А JPEG прозрачность не поддерживает. То есть наша задача состоит в том чтобы разобраться как правильно ресайзить PNG и GIF. У этих форматов прозрачность реализованна по-разному, и обрабатывать их надо соответственно по-разному.

    Ресайзим PNG

    Я думаю ни для кого не секрет, что в PNG реализованна поддержка альфа канала. То есть цвет задается четырмя компонентами: R (красный), G (зеленый), B (синий), альфа. Альфа канал задает прозрачность конкретного пикселя. Впрочем это все вы должны уже знать, перейдем к сути.

    Причин появления черного фона при ресайзе PNG три:

    • Программист создает не полноцветное изображение. Т.е. использует функцию imagecreate вместо imagecreatetruecolor
    • Программист забывает отключить наложение прозрачного цвета (или если правильно — «режим сопряжения цветов») с помощью функции imagealphablending. Дело в том что imagecreatetruecolor создает изображение с черным фоном. При включенном «режиме сопряжения цветов» прозрачный пиксель, не заменит фон, а будет рассчитан новый цвет в соответствии с новым цветом и цветом фона с учетом альфа канала обоих цветов — в итоге для полностью прозрачного пикселя получаем фоновой цвет — т.е. черный.
    • Программист не включает сохранение альфа канала в выходной файл. За это отвечает функция imagesavealpha

    Чтож, с причинами разобрались. Теперь реализация правильного ресайза PNG картинки:

    imagecreatetruecolor

    (PHP 4 >= 4.0.6, PHP 5)

    imagecreatetruecolor — Create a new true color image

    Описание

    imagecreatetruecolor() returns an image identifier representing a black image of the specified size.

    Depending on your PHP and GD versions this function is defined or not. With PHP 4.0.6 through 4.1.x this function always exists if the GD module is loaded, but calling it without GD2 being installed PHP will issue a fatal error and exit. With PHP 4.2.x this behaviour is different in issuing a warning instead of an error. Other versions only define this function, if the correct GD version is installed.

    Список параметров

    Возвращаемые значения

    Returns an image resource identifier on success, FALSE on errors.

    Примеры

    Пример #1 Creating a new GD image stream and outputting an image.

    Результатом выполнения данного примера будет что-то подобное:

    Примечания

    Замечание: Эта функция нуждается в GD версии 2.0.1 или выше.

    Смотрите также

    • imagedestroy() — Destroy an image
    • imagecreate() — Create a new palette based image

    Функция Imagecreatetruecolor

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

    Параметр Width являет собой ширину изображения.

    Параметр Height должен содержать высоту изображения соответственно.

    Функция Imagecreatetruecolor возвращает ресурс изображения в случае успеха, или FALSE в случае ошибки.

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

    php — PHP, imagecreate, imagecreatetruecolor, imagecopy, imagecopymerge

    Я использую функцию PHP и путаю.

    Сначала я готовлю два файла png.

    QR-код с прозрачным фоном и черной точкой, я создаю его с помощью этого кода (только ключевая точка, а не все).

    Я делаю png и использую цвет, чтобы заполнить его фон краской MS.

    Подготовьтесь. Тогда код

    Код делает 3.png следующим образом: www.capbite.com/subfolder/lion/test/3.png

    Теперь, если я использую

    Трудно описать образ, созданный разными способами, поэтому я вставляю ссылку на изображения, но моей репутации недостаточно, чтобы размещать больше ссылок или изображений. — Отредактировано Niet;)

    Мой вопрос: просто 3.png, он имеет прозрачный фон, даже использует другую функцию create, но когда он копирует на другое изображение, которое я создал или с помощью MS paint, результатом я встречаюсь.

    Что отличает imagecreate & imagecreatetruecolor от 4-1.png и 4-3.png?

    Какая разница между imagecopy & imagecopymerge (даже pct set 100) составляет 4-3.png и 4-4.png?

    Какая разница между изображениями, которые я создал или с помощью краски MS, составляет 4-3.png и 5-3.png?

      2 1
    • 30 июн 2020 2020-06-30 20:06:04
    • Lion

    1 ответ

    Я бы рекомендовал использовать imagecreate , а не imagecreatetruecolor .

    При использовании imagecreate , первый цвет, который вы определяете, будет цветом фона, который заполняет весь холст. Обычно это будет ваш «прозрачный» цвет, однако, как правило, это лучше (читайте: более эффективно в файле), чтобы сделать это следующим образом:

    Таким образом, вы не используете альфа-канал, вы просто говорите ему, что «все, что я рисую ярко-розовым, будет прозрачным» — вот как работает прозрачность в изображениях GIF, кстати, а также «традиционный «способ сделать это, вернувшись к старым играм многих лет назад!

    Используя imagecreate -generated изображения, копирование работает намного проще, потому что GD точно знает, какой цвет является «прозрачным» и, следовательно, его нельзя копировать в цель. При использовании imagecreatetruecolor , вы попадаете в сложный и грязный бизнес композитинга.

    Я надеюсь, что это помогает вам. GD может быть сложным зверьком, чтобы справиться, но как только вы знаете основы, вам должно быть хорошо идти.

    Илон Маск рекомендует:  strrchr - Находит последнее вхождение подстроки
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL