Подтвердить что ты не робот

PHP скрипт для рендеринга одного прозрачного пикселя (PNG или GIF)

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

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

4b9b3361

Ответ 1

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

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

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

header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');

Ответ 2

В 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)));

Ответ 3

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

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

Файл чтения не очень хорош, он может работать, но лучше возвращать необработанные данные, как показано в основном ответе 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");

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

Ответ 4

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

hexdump -v -e '"\\\x" 1/1 "%X"' image.gif; echo