PHP скрипт для визуализации одного прозрачного пикселя (PNG или GIF) - PullRequest
55 голосов
/ 08 июля 2010

Мне нужно создать PHP, который будет возвращать поток изображения с одной прозрачной точкой (PNG или GIF)

Не могли бы вы указать мне простое в использовании решение?

Ответы [ 4 ]

161 голосов
/ 08 июля 2010

Прозрачный 1x1 PNG:

header('Content-Type: image/png');
echo base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=');

Прозрачный 1x1 GIF:

header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');
17 голосов
/ 05 июня 2015

В PHP 5.4 и выше можно использовать hex2bin , что примерно в два раза быстрее, чем base64_decode (протестировано с пустым файлом GIF ниже). Код для вывода изображений будет:

Прозрачный 1x1 PNG:

header('Content-Type: image/png');
die(hex2bin('89504e470d0a1a0a0000000d494844520000000100000001010300000025db56ca00000003504c5445000000a77a3dda0000000174524e530040e6d8660000000a4944415408d76360000000020001e221bc330000000049454e44ae426082'));

Прозрачный 1x1 GIF:

header('Content-Type: image/gif');
die(hex2bin('47494638396101000100900000ff000000000021f90405100000002c00000000010001000002020401003b'));

Вы можете легко преобразовать данные в кодировке base64 в шестнадцатеричные:

echo bin2hex(base64_decode($data));

Или файл:

echo bin2hex(base64_decode(file_get_contents($filename)));

Однако, согласно моему тесту, использование собственного метода escape PHP, предложенного @Lukas Liesis, является самым быстрым, примерно в 12,5 раз быстрее, чем base64_decode. И это будет работать практически с любой версией PHP. Вот фрагменты кода:

Прозрачный 1x1 PNG:

header('Content-Type: image/png');
die("\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x01\x00\x00\x00\x01\x01\x03\x00\x00\x00\x25\xdb\x56\xca\x00\x00\x00\x03\x50\x4c\x54\x45\x00\x00\x00\xa7\x7a\x3d\xda\x00\x00\x00\x01\x74\x52\x4e\x53\x00\x40\xe6\xd8\x66\x00\x00\x00\x0a\x49\x44\x41\x54\x08\xd7\x63\x60\x00\x00\x00\x02\x00\x01\xe2\x21\xbc\x33\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82");

Прозрачный 1x1 GIF:

header('Content-Type: image/gif');
die("\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x90\x00\x00\xff\x00\x00\x00\x00\x00\x21\xf9\x04\x05\x10\x00\x00\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x04\x01\x00\x3b");

Создать такую ​​строку легко с помощью регулярных выражений (как это делается один раз, она не должна работать быстро):

echo preg_replace('/../','\\x\0',bin2hex($data));

или из файла:

echo preg_replace('/../','\\x\0',bin2hex(file_get_contents($filename)));
6 голосов
/ 25 октября 2014

несколько ответов на вопросы людей:

Вы должны повторить содержание изображения.Заголовок показывает, что вы возвращаете не текст, а изображение.Так что, если вы вернули заголовок, это просто заголовок - без данных.Затем вы распечатываете данные изображения и все готово, вы просто отправляете изображение:)

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

У меня был этот код даже без декодирования base64, но это изображение белого цвета:

header('Content-Type: image/gif');
// 1x1px white gif
die("\x47\x49\x46\x38\x37\x61\x1\x0\x1\x0\x80\x0\x0\xfc\x6a\x6c\x0\x0\x0\x2a\x0\x0\x0\x0\x1\x0\x1\x0\x0\x2\x2\x44\x1\x0\x3b");

Может быть, кто-то знает, как преобразовать любой файл в такойстрока данных?

0 голосов
/ 18 февраля 2016

В Linux вы можете преобразовать его, набрав в консоли:

hexdump -v -e '"\\\x" 1/1 "%X"' image.gif; echo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...