문제

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 데이터를 검증하기 위해 체크섬으로 사용하려고 할 수도 있습니다. 예를 들어, 파일에서 읽은 후 전송 후 등

해결책:

필요한 것에 대한 완벽한 도구를 찾았습니다.

http://www.thomasbarker.co.uk/2011/05/29/corrupt-jpeg-checkertool-for-finding-corrupt-jpeg-image-files/

디렉토리를 통해 재귀 적으로 검색하고 손상된 JPEG를 찾습니다. 원하는만큼 CPU를 사용할 수있을 것 같습니다.

나를 위해 일했습니다.

간단히 getImagesize ()가있는 다른 솔루션이 있습니다.

if(!getimagesize($image_url)) echo 'Image is corrupt or not readable';
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top