Эффективно обнаружить поврежденный файл JPEG? - PullRequest
14 голосов
/ 13 октября 2008

Есть ли эффективный способ обнаружения, если файл JPEG поврежден?

Справочная информация:
решения должны работать из скрипта php
файлы JPEG находятся на диске
ручная проверка не возможна (загруженные пользователем данные)

Я знаю, что imagecreatefromjpeg(string $filename); может это сделать. Но это довольно медленно.

Кто-нибудь знает более быстрые / более эффективные решения?

Ответы [ 8 ]

17 голосов
/ 13 октября 2008

Из командной строки вы можете использовать jpeginfo, чтобы узнать, в порядке ли файл jpeg.

$ jpeginfo -c test.jpeg

test.jpeg 260 x 264 24 бит JFIF N 15332 [OK]

Вызывать jpeginfo из php должно быть тривиально.

8 голосов
/ 26 октября 2009

Мое простейшее (и самое быстрое) решение:


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);
}

Примечание. При этом обнаруживается только поврежденная файловая структура, но НЕ выявляются поврежденные данные изображения.

6 голосов
/ 04 мая 2010

К вашему сведению - я использовал вышеописанный метод (jpeg_file_is_complete) для проверки JPEG-файлов, которые, как я знаю, повреждены (например, когда я загружаю их в браузер, нижняя часть отображается серым цветом - т.е. изображение "обрезано"). Во всяком случае, когда я запустил вышеупомянутый тест для этого образа, он НЕ обнаружил его как поврежденный.

Пока что использование imagecreatefromjpeg() работает, но не очень быстро. Я обнаружил, что использование jpeginfo работает также и для обнаружения этих типов поврежденных изображений, и это БЫСТРЕЕ, чем imagecreatefromjpeg (я запустил эталонный тест в моем PHP, используя microtime()).

0 голосов
/ 10 мая 2017

Просто небольшая заметка - как получить jpeginfo для Windows (64 бит)? На github автора нет бинарных файлов win32 / win64, но вы можете сделать это:

1) получить jpeginfo.exe из этого архива: https://github.com/MoserMichael/cstuff/raw/master/img-archive/img-archive.zip

2) захватить cygwin1.dll из этого архива: FTP: //mirror.internode.on.net/pub/cygwin/x86/release/cygwin64/cygwin64-2.6.0-1.tar.xz

Проверьте его из командной строки, если он работает: jpeginfo --help. Если есть информация - она ​​работает просто отлично.

Как проверить вывод jpeginfo?

jpeginfo возвращает 0, если файл исправен, но возвращает 1 не только тогда, когда его нет, но и когда он нашел что-то, чего не понимает Затем он генерирует сообщение, подобное этому:

Warning: unknown JFIF revision number 2.01 1280 x 720 24bit JFIF N 122550 [WARNING]

Для поврежденных файлов возвращается 1 и сообщение, подобное этому:

1328 x 2048 24bit JFIF N 1310080 Premature end of JPEG file [WARNING]

Поэтому вы можете проверить фактический вывод, а не только код возврата.

0 голосов
/ 15 декабря 2015

Пожалуйста, попробуйте

<?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';
}
?>
0 голосов
/ 29 марта 2014

У меня есть другое решение с простой getimagesize ()

if(!getimagesize($image_url)) echo 'Image is corrupt or not readable';
0 голосов
/ 03 апреля 2013

Решение:

Я нашел идеальный инструмент для того, что мне было нужно:

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

Рекурсивно просматривает каталог и находит любые поврежденные файлы JPEG. Похоже, вы также можете использовать столько процессоров, сколько захотите.

работал для меня.

0 голосов
/ 22 января 2010

Вы также можете попытаться сгенерировать хэш файла на основе MD5 и использовать его в качестве контрольной суммы для проверки данных JPEG на различных этапах. Например, после чтения из файла, затем после передачи и т. Д.

...