바이너리 이미지 데이터를 이전 데이터베이스에 저장 했으므로 이전 개발자가 저장 했으므로 이제는 PHP를 사용하여이 이미지를 표시하고 싶습니다.PHP를 사용하여 이진 데이터를 이미지로 변환
나는 imagecreatefromstring
을 시도했지만 FALSE
을 반환합니다.
진 예를 들어 데이터 : http://freezinfo.com/gg.php
바이너리 이미지 데이터를 이전 데이터베이스에 저장 했으므로 이전 개발자가 저장 했으므로 이제는 PHP를 사용하여이 이미지를 표시하고 싶습니다.PHP를 사용하여 이진 데이터를 이미지로 변환
나는 imagecreatefromstring
을 시도했지만 FALSE
을 반환합니다.
진 예를 들어 데이터 : http://freezinfo.com/gg.php
문자열이 텍스트 (extactly this sequence)로 표시되면 16 진수의 라인업입니다.이펙에서
, 이러한 파일의 매직 넘버는 마지막 두 바이트 ( How to identify contents of a byte[] is a jpeg?와 비교)로 처음 두 바이트로FF D8
및
FF 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
및 다음 이미지 :
이는 필사적으로 깨진 보인다. 따라서 여기에 추가적인 인코딩 문제가있을 수 있습니다. 마지막 NUL
바이트는 더 많은 작업이 완료되었음을 암시하며, 데이터베이스가이를 지원하기 때문에 이진 데이터 (blob) 대신 16 비트 16 진수 값으로 데이터가 저장되는 이유가 있어야합니다.
과거에 사용 된 소프트웨어 및 구성의 결함으로 인해 너무 많은 시간을 낭비하지 마십시오. 데이터 손실 일 수 있으므로 백업에서 복원하면됩니다.
검색하려는 데이터는 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)
결론
당신은 정말 당신이 진수로 이미지를 변환하는 방법을 검토 할 필요가 엉망 보인다 양식이 문제를 해결
이진수가 아니므로 16 진수입니다. – vascowhite
괜찮지 만 데이터베이스에 저장된 이미지 데이터입니다 –
이 정보가 도움이 될 수 있습니다 http://stackoverflow.com/questions/13274691/coverting-hex-to-image-in-php. 그리고 당신이 그것에 접근 할 수 있다면 이미지가 데이터베이스에 저장되는 곳으로부터 코드를 찾으십시오. – alwaysLearn