2013-07-11 5 views
2

바이너리 이미지 데이터를 이전 데이터베이스에 저장 했으므로 이전 개발자가 저장 했으므로 이제는 PHP를 사용하여이 이미지를 표시하고 싶습니다.PHP를 사용하여 이진 데이터를 이미지로 변환

나는 imagecreatefromstring을 시도했지만 FALSE을 반환합니다.

진 예를 들어 데이터 : http://freezinfo.com/gg.php

+1

이진수가 아니므로 16 진수입니다. – vascowhite

+0

괜찮지 만 데이터베이스에 저장된 이미지 데이터입니다 –

+2

이 정보가 도움이 될 수 있습니다 http://stackoverflow.com/questions/13274691/coverting-hex-to-image-in-php. 그리고 당신이 그것에 접근 할 수 있다면 이미지가 데이터베이스에 저장되는 곳으로부터 코드를 찾으십시오. – alwaysLearn

답변

1

문자열이 텍스트 (extactly this sequence)로 표시되면 16 진수의 라인업입니다.이펙에서

, 이러한 파일의 매직 넘버는 마지막 두 바이트 ( How to identify contents of a byte[] is a jpeg?와 비교)로 처음 두 바이트로 FF D8FF D9 있습니다. 숫자

이 진수 (짧은 진수)과 시퀀스의 시작과 끝에서 찾을 수 있습니다

FF00D800FF00 ... 1F00FF00D9000 
## ##    ## ## 

이 매직 넘버를 찾고 또한 16 진수 값은 항상 00에 추가되는 것을 알 수있다. 또한 마지막에 여분의 단일 0이 발견되었습니다.

그래서 4 개의 문자가 항상 하나의 값을 형성합니다. 16 진수로 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: recoverable error: Corrupt JPEG data: bad Huffman code

및 다음 이미지 :

enter image description here

이는 필사적으로 깨진 보인다. 따라서 여기에 추가적인 인코딩 문제가있을 수 있습니다. 마지막 NUL 바이트는 더 많은 작업이 완료되었음을 암시하며, 데이터베이스가이를 지원하기 때문에 이진 데이터 (blob) 대신 16 비트 16 진수 값으로 데이터가 저장되는 이유가 있어야합니다.

과거에 사용 된 소프트웨어 및 구성의 결함으로 인해 너무 많은 시간을 낭비하지 마십시오. 데이터 손실 일 수 있으므로 백업에서 복원하면됩니다.

3

검색하려는 데이터는 HTML과 HEX의 형식을 가지고 있지만 이미지가 유효 손상되었거나 없습니다.

지금

echo substr($data, 0, 4); // returns FF00 

FF00 그것은 FFD8 시작해야 유효한 JPEG 접두사하지 않은 헤더를 검사 수 있습니다

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

오류 :

데이터를 얻으려면 또는 FfD9

어떻게 그 JPEG 파일을 알고 유효하지 않습니까?

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

출력이 명확하게 JPEG File Interchange Format

입니다 JFIF을 참조 방법이

����JFIF 

을 고정 할 수있다?

이미지 헤더 다시 $data 보면 빠른 이미지 확인 imagecreatefromstring

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

.. 나는 00 실제로 그래서를 제거 할 삽입되는 것으로 나타났습니다

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

패턴을 볼 수 있었다 유효한 이미지 헤더를 알려주세요. FFD8

ca 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

괜찮 았습니다. 감사 –

관련 문제