Поиск…


замечания

При использовании header("Content-Type: $mimeType"); и image____ чтобы генерировать только изображение на выходе, обязательно ничего не выводить, обратите внимание на пустую строку после ?> . (Это может быть сложной «ошибкой» для отслеживания - вы не получаете изображения и не знаете, почему.) Общий совет - не включать?> Вообще здесь.

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

Чтобы создать пустое изображение, используйте функцию imagecreatetruecolor :

$img = imagecreatetruecolor($width, $height);

$img теперь является переменной ресурса для ресурса изображения с пикселями $height $width x $height . Обратите внимание, что ширина отсчитывается слева направо, а высота отсчитывается сверху вниз.

Ресурсы изображений также могут быть созданы из функций создания изображений , таких как:

  • imagecreatefrompng
  • imagecreatefromjpeg
  • другие imagecreatefrom* функции.

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

imagedestroy($image);

Преобразование изображения

Изображения, созданные путем преобразования изображения, не изменяют изображение, пока вы его не выведете. Следовательно, преобразователь изображения может быть таким же простым, как три строки кода:

function convertJpegToPng(string $filename, string $outputFile) {
    $im = imagecreatefromjpeg($filename);
    imagepng($im, $outputFile);
    imagedestroy($im);
}

Выход изображения

Изображение может быть создано с использованием функций image* , где * - это формат файла.

Они имеют такой синтаксис:

bool image___(resource $im [, mixed $to [ other parameters]] )

Сохранение файла

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

Например, чтобы сохранить файл PNG:

imagepng($image, "/path/to/target/file.png");

$stream = fopen("phar://path/to/target.phar/file.png", "wb");
imagepng($image2, $stream);
// Don't fclose($stream)

При использовании fopen обязательно используйте флаг b а не флаг t , потому что файл является двоичным.

Не пытаются передать fopen("php://temp", $f) или fopen("php://memory", $f) к нему. Поскольку поток после вызова закрыт функцией, вы не сможете использовать его дальше, например, для извлечения его содержимого.

Вывод в виде ответа HTTP

Если вы хотите прямо вернуть это изображение в ответ на изображение (например, для создания динамических значков), вам не нужно передавать что-либо (или передавать null ) в качестве второго аргумента. Однако в ответе HTTP вам необходимо указать свой тип контента:

header("Content-Type: $mimeType");

$mimeType - это тип MIME формата, который вы возвращаете. Примеры включают image/png , image/gif и image/jpeg .

Запись в переменную

Существует два способа записи в переменную.

Использование OB (буферизация вывода)

ob_start();
imagepng($image, null, $quality); // pass null to supposedly write to stdout
$binary = ob_get_clean();

Использование обтекателей потоков

У вас может быть много причин, по которым вы не хотите использовать буферизацию вывода. Например, у вас может быть OB. Поэтому необходима альтернатива.

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

<?php

class GlobalStream{
        private $var;

        public function stream_open(string $path){
                $this->var =& $GLOBALS[parse_url($path)["host"]];
                return true;
        }

        public function stream_write(string $data){
                $this->var .= $data;
                return strlen($data);
        }
}

stream_wrapper_register("global", GlobalStream::class);

$image = imagecreatetruecolor(100, 100);
imagefill($image, 0, 0, imagecolorallocate($image, 0, 0, 0));

$stream = fopen("global://myImage", "");
imagepng($image, $stream);
echo base64_encode($myImage);

В этом примере класс GlobalStream записывает любые входные данные в ссылочную переменную (т. Е. Косвенно записывает глобальную переменную данного имени). В дальнейшем глобальную переменную можно получить напрямую.

Есть некоторые особенности:

  • Полностью реализован поток класс - оболочка должна выглядеть это , но согласно тестам с __call магическим способом, только stream_open , stream_write и stream_close вызываются из внутренних функций.
  • В вызове fopen флаги не требуются, но вы должны хотя бы передать пустую строку. Это связано с тем, что функция fopen ожидает такой параметр, и даже если вы не используете его в своей реализации stream_open , фиктивная по-прежнему требуется.
  • Согласно тестам, stream_write вызывается несколько раз. Не забудьте использовать .= (Назначение конкатенации), not = (назначение прямой переменной).

Пример использования

В <img> HTML изображение можно напрямую предоставить, а не использовать внешнюю ссылку:

echo '<img src="data:image/png;base64,' . base64_encode($binary) . '">';

Обрезка и изменение размера изображения

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

сначала создайте новое image с нужными размерами:

// new image
$dst_img = imagecreatetruecolor($width, $height);

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

  • JPEG
  • GIF
  • PNG
  • строка

Например:

//original image
$src_img=imagecreatefromstring(file_get_contents($original_image_path));

Теперь скопируйте все (или часть) оригинальное изображение (src_img) в новое изображение (dst_img) с помощью imagecopyresampled :

imagecopyresampled($dst_img, $src_img, 
    $dst_x ,$dst_y, $src_x, $src_y, 
    $dst_width, $dst_height, $src_width, $src_height);

Чтобы установить src_* и dst_* , используйте следующее изображение:

введите описание изображения здесь

Теперь, если вы хотите скопировать весь исходный (исходный) образ во всю область назначения (без обрезки):

$src_x = $src_y = $dst_x = $dst_y = 0;
$dst_width = $width;// width of new image
$dst_height = $height; //height of new image
$src_width = imagesx($src_img); //width of initial image
$src_height = imagesy($src_img); //height of initial image


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow