Проверка изображений на ошибки

KillDead

Хранитель порядка
Регистрация
11 Авг 2006
Сообщения
894
Реакции
579
Здравствуйте. Возникла необходимость сделать скрип: есть достаточно много картинок , шеллов в них нету (это фильтровать не надо ) - но неизвестно являются ли они картинками вообще и закачались ли без ошибок.
Сделал
Код:
$size = getimagesize($file);...
но этот код не обнаружит если в картинках есть ошибки. Сделал так-
Код:
        $size = getimagesize($file);
 
        if (isset($size['mime'])) {
 
            // проверка, есть ли битые картинки
            switch ($size['mime']) {
                case 'image/gif':
 
                    $o_im = imageCreateFromGIF($file);
                     if(!$o_im) return false;
                    break;
                case 'image/jpeg':
....
Работает, но слишком долго, особенно если картинки большие.
Есть идеи как решить?
 
Есть хорошая утилитка у imagemagick. Часто ей пользуюсь для похожих задач:
Для просмотра ссылки Войди или Зарегистрируйся
Из PHP ее тоже можно вызвать:
Для просмотра ссылки Войди или Зарегистрируйся
Она даст всю инфу по картинке и покажет на все баги и неточности.
 
а где она показывает баги? подробнейшую инфу выводит

Код:
    [0] => Image: /testbad.jpg
    [1] =>  Format: JPEG (Joint Photographic Experts Group JFIF format)
    [2] =>  Class: DirectClass
    [3] =>  Geometry: 11811x7874+0+0
    [4] =>  Resolution: 100x100
    [5] =>  Print size: 118.11x78.74
    [6] =>  Units: PixelsPerInch
    [7] =>  Type: TrueColor
    [8] =>  Endianess: Undefined
    [9] =>  Colorspace: RGB
    [10] =>  Depth: 8-bit
    [11] =>  Channel depth:
    [12] =>    red: 8-bit
    [13] =>    green: 8-bit
    [14] =>    blue: 8-bit
    [15] =>  Channel statistics:
    [16] =>    Red:
    [17] =>      min: 0 (0)
    [18] =>      max: 255 (1)
    [19] =>      mean: 67.6003 (0.265099)
    [20] =>      standard deviation: 80.4165 (0.315359)
    [21] =>      kurtosis: -0.400659
    [22] =>      skewness: 1.00085
    [23] =>    Green:
    [24] =>      min: 0 (0)
    [25] =>      max: 255 (1)
    [26] =>      mean: 54.5598 (0.21396)
    [27] =>      standard deviation: 74.4278 (0.291874)
    [28] =>      kurtosis: 0.449939
    [29] =>      skewness: 1.33248
    [30] =>    Blue:
    [31] =>      min: 0 (0)
    [32] =>      max: 255 (1)
    [33] =>      mean: 45.6389 (0.178976)
    [34] =>      standard deviation: 69.2509 (0.271572)
    [35] =>      kurtosis: 1.39939
    [36] =>      skewness: 1.6163
    [37] =>  Image statistics:
    [38] =>    Overall:
    [39] =>      min: 0 (0)
    [40] =>      max: 255 (1)
    [41] =>      mean: 55.933 (0.219345)
    [42] =>      standard deviation: 74.8376 (0.293481)
    [43] =>      kurtosis: 0.436062
    [44] =>      skewness: 1.3222
    [45] =>  Rendering intent: Undefined
    [46] =>  Interlace: None
    [47] =>  Background color: white
    [48] =>  Border color: rgb(223,223,223)
    [49] =>  Matte color: grey74
    [50] =>  Transparent color: black
    [51] =>  Compose: Over
    [52] =>  Page geometry: 11811x7874+0+0
    [53] =>  Dispose: Undefined
    [54] =>  Iterations: 0
    [55] =>  Compression: JPEG
    [56] =>  Quality: 86
    [57] =>  Orientation: Undefined
    [58] =>  Properties:
    [59] =>    date:create: 2013-02-15T15:30:34+04:00
    [60] =>    date:modify: 2013-02-15T15:31:55+04:00
    [61] =>    exif:ImageDescription: kinopoisk.ru
    [62] =>    jpeg:colorspace: 2
    [63] =>    jpeg:sampling-factor: 2x2,1x1,1x1
    [64] =>    signature: d4f815b68ca61e30e49dd48a1aefe0493d742c229525e7d42a64ead05e8a3fb8
    [65] =>  Profiles:
    [66] =>    Profile-8bim: 8458 bytes
    [67] =>    Profile-exif: 45 bytes
    [68] =>    Profile-icc: 3144 bytes
    [69] =>      Description: sRGB IEC61966-2.1
    [70] =>      Manufacturer: IEC http://www.iec.ch
    [71] =>      Model: IEC 61966-2.1 Default RGB colour space - sRGB
    [72] =>      Copyright: Copyright (c) 1998 Hewlett-Packard Company
    [73] =>    Profile-iptc: 7 bytes
    [74] =>      unknown[2,0]:
    [75] =>  Artifacts:
    [76] =>    verbose: true
    [77] =>  Tainted: False
    [78] =>  Filesize: 2.643MB
    [79] =>  Number pixels: 93M
    [80] =>  Pixels per second: 32.19M
    [81] =>  User time: 2.496u
    [82] =>  Elapsed time: 0:03.888
    [83] =>  Version: ImageMagick 6.6.3-10 2010-08-30 Q16 http://www.imagemagick.org
)
Но для нормальной картинки меняются только статистика каналов да сигнатура.
 
К сожалению, из PHP либой так и не пользовался.
В основном, такого рода скрипты пишу на bat, bash или nodejs.
Всю информацию о картинке получать не стоит. Достаточно базовой проверки (без полной загрузки картинки в память) - это ускорит процесс.
Из напарсенных ссылок часто нельзя определить формат картинки (это единственное, что я анализирую, чтобы дать файлу нужное расширение). В случае базовой проверки галюны картинок не найдешь, зато identify легко отличит картинки от, например, 404-й страницы.
Если использовать ключ -regard-warnings identify покажет все ошибки парсинга картинки.

Кстати, используя утилитку convert вместо identify можно выгодно уникализировать картинку, например, повышая параметр quality или накладывая разные фильтры, о которых можно почитать на офсайте. Всегда пользовался, к сожалению, картиночный траф монитизировать неумею, но картинки на моих сайтах очень часто в топах и яши и гугла.
 
Из напарсенных ссылок часто нельзя определить формат картинки (это единственное, что я анализирую, чтобы дать файлу нужное расширение). В случае базовой проверки галюны картинок не найдешь, зато IM легко отличит картинки от, например, 404-й страницы.

Да, в определении расширения проблем нету, да и запустить из командрой строки в пхп - проблем нет. Но мне надо узнать - до конца ли закачалась картинка, часто сайт сбоит при больших потоках, на 1к картинок порой штуки 1-2 проскакивают. А если через прокси делать - вообще абзац.
Через стандартные средства пхп, вернее через гд, на тестувую картинку потратила 500 метров, а вот imagick вообще сожрал 800 и одно ядро процессора загрузил на 100%, ну и выполнялся дольше.
 
Ну identify всегда жрет ядро по максимуму при полном анализе картинки, правда на доли секунд, но в среднем сам жрет 60-80мб памяти. Странное поведение. А как именно определяешь сколько жрет памяти он? Может быть, виновата сама реализация модуля imagemagick в PHP.
В один поток у меня он обрабатывает 30-50 картинок в секунду (скрипт на nodejs). Сам node жрет около 15-20мб (процессор жрет по минимуму, приблизительно 0%), identify жрет все ядро и 60-80мб памяти.
Делаешь количество потоков равное количеству ядер и гигабайт картинок прочекается за минуты.
Если хочешь, могу побыстрому накидать скриптец в несколько строк на node.
 
Спасибо, пока не надо) запускаю просто через exec
identify.exe -verbose -regard-warnings ..../test.jpg
Сколько жрёт памяти - тупо смотрю диспечер задач. Правда картинка большая - 11к на 7к пикселей.

Пытаюсь сделать кэш на жёсткий диск, а не в память -
identify.exe -verbose -regard-warnings -define registry:temporary-path=D:\ -limit memory 200mb -limit map 200mb testbad.jpg

Создаёт всё те же 750 метров. Возможно у меня так система загажена- пишет Elapsed time: 0:18.257 , хотя я замерил время прошло две минуты.

Если не сложно, можешь посмотреть, за сколько времени проверит картинку - Для просмотра ссылки Войди или Зарегистрируйся
 
Если не сложно, можешь посмотреть, за сколько времени проверит картинку - Для просмотра ссылки Войди или Зарегистрируйся

Да, такая картинка будет обрабатываться порядком долго. Память, сжираемая на нее - тоже оправдана (~3-4 байта на каждый пиксель, ведь он распаковывает картинку в память и работает с ней как с .bmp). к сожалению, уже времени посмотреть нет, убегаю от компьютера.

Попробуй запустить без ключа -verbose
 
Да уж. Интересно, для какого сайта тебе требуются эти картинки...
У меня браузер не может открыть эту картинку, вылетает, наверное от ограничений в памяти)))

Фотошоп вроде работает нормально. Может, есть вариант использовать его в консольном режиме. Хотя тут уже я теряюсь...
 
Назад
Сверху