使用php将二进制数据转换为图像

时间:2013-07-11 09:46:47

标签: php binary php-imagine

我将二进制图像数据保存在我的旧数据库中,它由我的旧开发人员保存,现在我想使用PHP显示图像,但我不能。

我已尝试imagecreatefromstring但它返回FALSE

二进制示例数据:http://freezinfo.com/gg.php

2 个答案:

答案 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数据:坏的霍夫曼代码

和下图:

enter image description here

这看起来非常破碎。所以你可能在这里遇到了额外的编码问题。最后一个NUL字节表明已经完成了更多工作,并且还必须有一个原因,为什么数据已经存储为16位十六进制值而不仅仅是二进制数据(blob),因为数据库支持它。

但是不要浪费太多时间,因为过去使用的软件和配置存在缺陷,这可能只是数据丢失所以你所能做的就是从备份中恢复。