首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >渲染单个透明像素的PHP脚本(PNG或GIF)

渲染单个透明像素的PHP脚本(PNG或GIF)
EN

Stack Overflow用户
提问于 2010-07-08 20:09:41
回答 5查看 29.4K关注 0票数 60

我必须创建一个PHP,它将返回一个透明点(PNG或GIF)的图像流

你能告诉我一个简单易用的解决方案吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-08 20:13:31

透明1x1 PNG:

代码语言:javascript
复制
header('Content-Type: image/png');
echo base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=');

透明1x1 GIF:

代码语言:javascript
复制
header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');
票数 170
EN

Stack Overflow用户

发布于 2015-06-05 18:54:21

在PHP5.4和更高版本中,可以使用hex2bin,它大约比base64_decode快两倍(使用下面的空白GIF文件进行测试)。输出图像的代码为:

透明1x1 PNG:

代码语言:javascript
复制
header('Content-Type: image/png');
die(hex2bin('89504e470d0a1a0a0000000d494844520000000100000001010300000025db56ca00000003504c5445000000a77a3dda0000000174524e530040e6d8660000000a4944415408d76360000000020001e221bc330000000049454e44ae426082'));

透明1x1 GIF:

代码语言:javascript
复制
header('Content-Type: image/gif');
die(hex2bin('47494638396101000100900000ff000000000021f90405100000002c00000000010001000002020401003b'));

您可以轻松地将base64编码的数据转换为十六进制:

代码语言:javascript
复制
echo bin2hex(base64_decode($data));

或文件:

代码语言:javascript
复制
echo bin2hex(base64_decode(file_get_contents($filename)));

然而,根据我的基准测试,使用@Lukas Liesis建议的原生PHP转义方法是最快的,大约比base64_decode快12.5倍。而且它几乎适用于任何版本的PHP。以下是代码片段:

透明1x1 PNG:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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");

使用正则表达式创建这样的字符串很容易(因为只需做一次,所以它不需要快速工作):

代码语言:javascript
复制
echo preg_replace('/../','\\x\0',bin2hex($data));

或者来自一个文件:

代码语言:javascript
复制
echo preg_replace('/../','\\x\0',bin2hex(file_get_contents($filename)));
票数 23
EN

Stack Overflow用户

发布于 2014-10-25 04:55:09

回答一些人的问题:

您必须回显图像的内容。标题只显示您要返回给浏览器的图像,而不是普通文本。所以如果你只返回一个头,它只是一个头--没有数据。但是,打印出图像的数据并完成后,您只发送了一张图像:)

读取文件并不好,它可以工作,但最好返回原始数据,如Sjoerd的main answer中所示。这样,您就可以节省时间和服务器负载,而不必处理读取操作。从磁盘读取数据是一项缓慢的任务。随着时间的推移,使用SSD磁盘从磁盘读取数据的速度有所提高,但仍以无I/O到磁盘为佳。

即使没有base64解码,我也有这个代码,但这个图像是白色的:

代码语言:javascript
复制
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");

也许有人知道如何将任何文件转换为这样的数据字符串?

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3203354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档