손상된 JPEG 파일을 효율적으로 감지 하시겠습니까?
-
10-07-2019 - |
문제
JPEG 파일이 손상된 경우 효율적인 감지 방법이 있습니까?
배경 정보 :
솔루션은 PHP 스크립트 내에서 작동해야합니다
JPEG 파일은 디스크에 있습니다
수동 확인은 옵션이 아닙니다 (사용자 업로드 데이터)
나는 그것을 알고있다 imagecreatefromjpeg(string $filename);
할 수있어. 그러나 그렇게하는 것은 매우 느립니다.
더 빠르고 효율적인 솔루션을 아는 사람이 있습니까?
해결책
명령 줄에서 JPEGINFO를 사용하여 JPEG 파일이 정상인지 확인할 수 있습니다.
$ jpeginfo -c test.jpeg
Test.jpeg 260 x 264 24 비트 JFIF N 15332 [OK
PHP에서 JPEGINFO를 호출하는 것은 사소한 일입니다.
다른 팁
가장 단순하고 가장 빠른 솔루션 :
function jpeg_file_is_complete($path) {
if (!is_resource($file = fopen($path, 'rb'))) {
return FALSE;
}
// check for the existence of the EOI segment header at the end of the file
if (0 !== fseek($file, -2, SEEK_END) || "\xFF\xD9" !== fread($file, 2)) {
fclose($file);
return FALSE;
}
fclose($file);
return TRUE;
}
function jpeg_file_is_corrupted($path) {
return !jpeg_file_is_complete($path);
}
참고 : 이것은 손상된 파일 구조 만 감지하지만 손상된 이미지 데이터를 감지하지는 않습니다.
참고 - 나는 사용했습니다 위의 방법 (jpeg_file_is_complete
) 내가 알고있는 JPEG를 테스트하려면 손상되었습니다 (예를 들어, 바닥은 회색입니다. 즉, 이미지는 "컷오프"). 어쨌든, 그 이미지에서 위의 테스트를 실행했을 때 그것은 부패한 것으로 감지하지 못했습니다.
지금까지 사용합니다 imagecreatefromjpeg()
작동하지만 빠르지는 않습니다. 나는 그것을 사용하는 것을 발견했다 jpeginfo
이러한 유형의 손상된 이미지를 감지하기 위해 잘 작동하며 imagecreatefromjpeg
(PHP에서 벤치 마크를 사용했습니다 microtime()
).
시도해보십시오
<?php
$img = $_GET['img'];
$str_exec = 'jpeginfo -c /chroot/home/www/html/media/'.$img;
$result = exec($str_exec);
if(strpos($result, 'ERROR'))
{
echo 'ERROR';
}
else
{
echo 'OK';
}
?>
작은 노트 만- Windows 용 JPEGINFO를 얻는 방법 (64 비트)?저자의 Github에는 Win32/Win64 Binaries가 없지만이를 수행 할 수 있습니다.
1) 잡아 jpeginfo.exe
이 아카이브에서 :https://github.com/mosermichael/cstuff/raw/master/img-archive/img-achive.zip
2) 잡아 cygwin1.dll
이 아카이브에서 :ftp://mirror.internode.on.net/pub/cygwin/x86/release/cygwin64/cygwin64-2.6.0-1.tar.xz
작동하면 CommandLine에서 테스트하십시오. jpeginfo --help
. 인포가 있다면 잘 작동합니다.
JPEGINFO 출력을 테스트하는 방법은 무엇입니까?
jpeginfo
파일이 정상이면 0을 반환하지만 1이 아닌 경우뿐만 아니라 이해하지 못하는 것을 찾을 때 1을 반환합니다. 그런 다음 다음과 같은 메시지를 생성합니다.
Warning: unknown JFIF revision number 2.01 1280 x 720 24bit JFIF N 122550 [WARNING]
손상된 파일에서는 다음과 같은 메시지를 반환합니다.
1328 x 2048 24bit JFIF N 1310080 Premature end of JPEG file [WARNING]
따라서 실제 출력을 테스트 할 수 있습니다.
MD5를 기반으로 파일 해시를 생성하고 다양한 단계에서 JPEG 데이터를 검증하기 위해 체크섬으로 사용하려고 할 수도 있습니다. 예를 들어, 파일에서 읽은 후 전송 후 등
해결책:
필요한 것에 대한 완벽한 도구를 찾았습니다.
디렉토리를 통해 재귀 적으로 검색하고 손상된 JPEG를 찾습니다. 원하는만큼 CPU를 사용할 수있을 것 같습니다.
나를 위해 일했습니다.
간단히 getImagesize ()가있는 다른 솔루션이 있습니다.
if(!getimagesize($image_url)) echo 'Image is corrupt or not readable';