我必须创建一个PHP,它将返回一个透明点(PNG或GIF)的图像流
你能指点一个易于使用的解决方案吗?
答案 0 :(得分:160)
透明1x1 PNG:
header('Content-Type: image/png');
echo base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=');
透明1x1 GIF:
header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');
答案 1 :(得分:16)
在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)));
然而,根据我的基准测试,使用@Lukas Liesis建议的本机PHP转义方法是最快的,比base64_decode快12.5倍。它几乎适用于任何版本的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)));
答案 2 :(得分:6)
对人们问题的答案很少:
你必须回显图像的内容。标题显示,您返回的不是文本,而是图像。所以如果你返回标题,它只是一个标题 - 没有数据。然后你打印出图像数据并完成,你只需发送图像:)
读取文件不好,它可以工作,但最好返回原始数据,如Sjoerd在主要答案中所示。只是因为你保存了一个读操作。从磁盘读取是一项很慢的任务。现在它的速度随着SSD磁盘的增加而增加,但仍然如此。没有I / O到磁盘更好。
即使没有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");
也许有人知道如何将任何文件转换为此类数据字符串?
答案 3 :(得分:0)
header('Content-Type: image/gif');
sprintf('%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%', 71, 73, 70, 56, 57, 97, 1, 0, 1, 0, 128, 255, 0, 192, 192, 192, 0, 0, 0, 33, 249, 4, 1, 0, 0, 0, 0, 44, 0, 0, 0, 0, 1, 0, 1, 0, 0, 2, 2, 68, 1, 0, 59);
答案 4 :(得分:-1)
在Linux中,您可以通过在控制台中输入来转换它:
hexdump -v -e '"\\\x" 1/1 "%X"' image.gif; echo