我将二进制图像数据保存在我的旧数据库中,它由我的旧开发人员保存,现在我想使用PHP显示图像,但我不能。
我已尝试imagecreatefromstring
但它返回FALSE
。
二进制示例数据:http://freezinfo.com/gg.php
答案 0 :(得分:3)
您尝试检索的数据包含HTML及其HEX格式,但图片已损坏或无效。
获取数据:
// $url = "log.txt";
$url = "http://freezinfo.com/gg.php";
// Load Data from URL
$data = file_get_contents($url);
// Remove ALL HTML Tags
$data = strip_tags($data);
错误
现在让我们检查一下标题
echo substr($data, 0, 4); // returns FF00
FF00
不是有效的jpeg前缀它应该以{{1}} OR FFD8
我怎么知道它的JPEG文件而且无效?
FfD9
输出
echo pack("H*", substr($data, 0, 60));
它显然引用了JPEG File Interchange Format
的JFIF如何解决?
快速图片验证����JFIF
imagecreatefromstring
再次查看图片标题$data = pack("H*", $data); // Convert from hex
$im = @imagecreatefromstring($data);
var_dump($im); // returns false
..我可以看到一个模式
$data
我注意到FF00D800FF00E000000010004A00460049
^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^
已被插入,因此删除实际上会为我们提供有效的图片标题00
您可以使用简单的循环来解决此问题
FFD8
输出
// Trim all Spaces
$data = trim($data);
$newData = "";
for($i = 0; $i < strlen($data); $i += 4) {
$newData .= $data{$i} . $data{$i + 1};
}
$newData = pack("H*", $newData);
$im = imagecreatefromstring($newData);
var_dump($im); // resource(6, gd)
结论
你真的需要检查你将图像转换为十六进制的方式,它看起来搞砸了吗?
答案 1 :(得分:1)
鉴于字符串显示为文本(extactly this sequence),它是十六进制数字的阵容。
在Jpeg中,这样一个文件的幻数是FF D8
作为前两个字节,FF D9
作为最后两个字节(与How to identify contents of a byte[] is a jpeg?比较)。
这些十六进制(十六进制)数字也可以在序列的开头和结尾找到:
FF00D800FF00 ... 1F00FF00D9000
## ## ## ##
查找这些神奇的数字还会发现十六进制值始终附加00
。它还表明,最后会找到一个额外的单0
。
因此四个字符总是形成一个值。十六进制编码看起来像16位值,但值永远不会超过8位范围(0-255),因此始终可见00
。
单独使用此信息,然后可以尝试将其转换为PHP imagecreatefromstring
可以处理的二进制字符串:
$string = implode('', // map array of binary strings to binary string
array_map('chr', // map ord integer value to character
unpack('v*', // unsigned short (always 16 bit, little endian byte order)
pack("H*", $data) // hex to binary (high nibble first)
)));
然后在
中使用这样的字符串$result = imagecreatefromstring($string);
imagejpeg($result, 'test.jpg');
显示以下PHP错误通知:
imagecreatefromstring():gd-jpeg,libjpeg:可恢复的错误:损坏的JPEG数据:坏的霍夫曼代码
和下图:
这看起来非常破碎。所以你可能在这里遇到了额外的编码问题。最后一个NUL
字节表明已经完成了更多工作,并且还必须有一个原因,为什么数据已经存储为16位十六进制值而不仅仅是二进制数据(blob),因为数据库支持它。
但是不要浪费太多时间,因为过去使用的软件和配置存在缺陷,这可能只是数据丢失所以你所能做的就是从备份中恢复。