Разъяснение библиотеки PHP gd - PullRequest
3 голосов
/ 02 февраля 2010

Я смотрю на этот код и просматривал документы, но до сих пор не понимаю, как это должно работать. Код работает нормально, как он есть, но мне интересно, если я должен выводить заголовок в виде png вместо jpeg.

Что именно происходит в этом коде? Изображение png конвертируется в JPEG?

В конечном итоге я хочу сделать водяные знаки для всех изображений GIF, JPG, BMP и PNG в одном каталоге. Я вывожу все заголовки, независимо от типа изображения, как JPG. Это правильно? Я надеюсь, что здесь есть смысл, я немного устал.

$im2 = imagecreatefrompng($image)
imagecopy() and more code here
header("Content-Type: image/jpeg");
imagejpeg($im2,'',50);

Ответы [ 4 ]

3 голосов
/ 02 февраля 2010

То, что делает ваш код, более или менее выглядит следующим образом:

// Load the PNG file from disk into memory
$im2 = imagecreatefrompng($image) 

$im2 теперь resource, ссылаясь на изображение. Когда-то в памяти, это не PNG или JPEG; это необработанные, несжатые данные. «Формат» изображения указывает, как эти необработанные данные упаковываются и форматируются; на данный момент не имеет такого форматирования. Это просто данные в памяти.

// Some code which works with the image in memory, adding your watermark?
imagecopy() and more code here

// Tell the browser that we're output a JPG
header("Content-Type: image/jpeg");

Если вы запрашиваете jpg (то есть http://host.com/image.jpg), тогда сервер позаботится о том, чтобы вы написали этот заголовок для вас. Если вы создаете JPG на лету через PHP, вы должны вручную вывести заголовок. В противном случае, PHP предполагает, что вы пишете HTML, и выводит соответствующие заголовки для вас, как только напишите что-нибудь в стандартный вывод, либо через echo, либо просто используя текст / пробел вне тегов <?php ?>.

// compress as a jpeg, and send to browser
imagejpeg($im2,'',50);

imagejpeg берет необработанное изображение, сжимает его в формате jpg и записывает в файл (если вы задаете ему имя файла) или в stdout (который отправляет его в браузер). Технически для вывода в браузер 2-й аргумент должен быть null, а не ''. Последний параметр, 50, определяет качество JPEG в процентах. 100 - высокое качество, 0 - низкое качество.

1 голос
/ 02 февраля 2010

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

imagejpeg выводит данные пикселей в формате JPEG. Таким образом, ваш заголовок должен указывать jpeg в этом случае.

1 голос
/ 02 февраля 2010

Код загружает изображение в ресурс GD из файла PNG, затем манипулирует им и, наконец, выводит изображение в другом формате (JPEG) в браузер.

Когда вы вызываете imagecreatefrompng, вы не просто указываете, что GD должен использовать этот файл в качестве текущей рабочей копии изображения, вы говорите ему прочитать файл, декодировать его из формата PNG и загрузить это в памяти в каком-то неизвестном внутреннем формате. На этом этапе формат файла, из которого изображение было первоначально прочитано, больше не имеет значения. Когда вы выводите его, вы должны указать желаемый формат, поскольку у него больше нет формата, связанного с ним. Вот почему вы используете imagejpeg.

1 голос
/ 02 февраля 2010

Функция imagejpeg выводит изображение в формате JPEG независимо от формата исходного объекта. Если вы хотите сохранить исходный формат, вам нужно определить это при загрузке файла, а затем использовать другую функцию при создании вывода - есть функции imagepng, imagegif и т. Д.

...