2013-07-11 90 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

沒關係。沒關係。謝謝 –

相關問題