2013-07-11 57 views
2

我有我的旧数据库中保存的二进制图像数据,它由我的老开发人员保存,现在我想显示使用PHP的图像,但我不能。我试过imagecreatefromstring,但它返回FALSE将二进制数据转换为图像使用php

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

+1

这不是二进制的,它是十六进制。 – vascowhite

+0

好的,但它的图像数据保存在数据库中 –

+2

可能是这可以帮助你http://stackoverflow.com/questions/13274691/coverting-hex-to-image-in-php。如果您有权访问它,请尝试从图像保存在数据库中的位置查找代码。 – alwaysLearn

回答

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可以处理:使用这样的字符串,然后在

$result = imagecreatefromstring($string); 
imagejpeg($result, 'test.jpg'); 

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

揭示了以下PHP错误提示:

imagecreatefromstring(): gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: bad Huffman code

及以下图片:

enter image description here

这看起来绝望地坏了。所以你可能在这里面临额外的编码问题。最后的NUL字节表明已经完成了更多的工作,并且数据已经被存储为16位十六进制值而不仅仅是二进制数据(blob),这也是数据库支持的原因。

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

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前缀应该与FFD8启动OR FfD9

我是如何知道它的JPEG文件和它无效的?

echo pack("H*", substr($data, 0, 60)); 

输出

����JFIF 

它显然是有参考JFIF是JPEG File Interchange Format

怎样才可以解决吗?

快速图像验证imagecreatefromstring

$data = pack("H*", $data); // Convert from hex 
$im = @imagecreatefromstring($data); 
var_dump($im); // returns false 

望着像头再次$data ..我可以看到一个模式

FF00D800FF00E000000010004A00460049 
    ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 

我注意到,00被插入,以便除去实际上给我们一个有效的图像标题FFD8

你可以n上带有一个简单的循环

// 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) 

输出

resource(6, gd) 

结论

你真的需要检查你的图像转换为十六进制的方式,看起来很乱形式解决这个问题在这里

+0

但是,它仍然不显示图像。哪里有错? –

+0

图片损坏 – Baba

+0

没关系。没关系。谢谢 –

相关问题