2013-07-11 3 views
2

У меня есть данные двоичного изображения, сохраненные в моей старой базе данных, они сохранены моим старым разработчиком, теперь я хочу отображать изображение с помощью PHP, но я не могу.конвертировать двоичные данные в изображение с помощью php

Я пробовал imagecreatefromstring, но он возвращает FALSE.

Binary пример данных: 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.

Таким образом, четыре символа всегда образуют одно значение. Hex-encoded это выглядит как 16-битные значения, однако значение никогда не выходит за 8-битный диапазон (0-255), поэтому всегда отображается 00.

С помощью этой информации, а затем лишь один может попытаться превратить это в двоичную строку, что РНР 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: 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 ИЛИ FfD9

Как я узнал его файл JPEG и его недействительным?

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

Выход

����JFIF 

Это явно имеет отношение к JFIF который JPEG File Interchange Format

Как это исправить?

Быстрая проверка Image imagecreatefromstring

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

Глядя на заголовок снова $data изображение .. я мог видеть картину

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

Я заметил, что 00 будет вставлен так удалить, что бы на самом деле дайте нам действительный заголовок изображения FFD8

You ca п исправить это с помощью простого цикла

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

ok..that's fine. благодаря –

Смежные вопросы