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

Тема в разделе "PHP", создана пользователем KillDead, 15 фев 2013.

Модераторы: latteo
  1. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Здравствуйте. Возникла необходимость сделать скрип: есть достаточно много картинок , шеллов в них нету (это фильтровать не надо ) - но неизвестно являются ли они картинками вообще и закачались ли без ошибок.
    Сделал
    Код:
    $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':
    ....
    
    Работает, но слишком долго, особенно если картинки большие.
    Есть идеи как решить?
     
    Vishez нравится это.
  2. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    KillDead нравится это.
  3. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    а где она показывает баги? подробнейшую инфу выводит

    Код:
        [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
    )

    Но для нормальной картинки меняются только статистика каналов да сигнатура.
     
  4. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    К сожалению, из PHP либой так и не пользовался.
    В основном, такого рода скрипты пишу на bat, bash или nodejs.
    Всю информацию о картинке получать не стоит. Достаточно базовой проверки (без полной загрузки картинки в память) - это ускорит процесс.
    Из напарсенных ссылок часто нельзя определить формат картинки (это единственное, что я анализирую, чтобы дать файлу нужное расширение). В случае базовой проверки галюны картинок не найдешь, зато identify легко отличит картинки от, например, 404-й страницы.
    Если использовать ключ -regard-warnings identify покажет все ошибки парсинга картинки.

    Кстати, используя утилитку convert вместо identify можно выгодно уникализировать картинку, например, повышая параметр quality или накладывая разные фильтры, о которых можно почитать на офсайте. Всегда пользовался, к сожалению, картиночный траф монитизировать неумею, но картинки на моих сайтах очень часто в топах и яши и гугла.
     
  5. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Да, в определении расширения проблем нету, да и запустить из командрой строки в пхп - проблем нет. Но мне надо узнать - до конца ли закачалась картинка, часто сайт сбоит при больших потоках, на 1к картинок порой штуки 1-2 проскакивают. А если через прокси делать - вообще абзац.
    Через стандартные средства пхп, вернее через гд, на тестувую картинку потратила 500 метров, а вот imagick вообще сожрал 800 и одно ядро процессора загрузил на 100%, ну и выполнялся дольше.
     
  6. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Ну identify всегда жрет ядро по максимуму при полном анализе картинки, правда на доли секунд, но в среднем сам жрет 60-80мб памяти. Странное поведение. А как именно определяешь сколько жрет памяти он? Может быть, виновата сама реализация модуля imagemagick в PHP.
    В один поток у меня он обрабатывает 30-50 картинок в секунду (скрипт на nodejs). Сам node жрет около 15-20мб (процессор жрет по минимуму, приблизительно 0%), identify жрет все ядро и 60-80мб памяти.
    Делаешь количество потоков равное количеству ядер и гигабайт картинок прочекается за минуты.
    Если хочешь, могу побыстрому накидать скриптец в несколько строк на node.
     
  7. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Спасибо, пока не надо) запускаю просто через 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 , хотя я замерил время прошло две минуты.

    Если не сложно, можешь посмотреть, за сколько времени проверит картинку - http://rghost.ru/download/43818559/7e1f9c13f231a897983039a18d7db5b761904e7a/test.jpg
     
  8. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Да, такая картинка будет обрабатываться порядком долго. Память, сжираемая на нее - тоже оправдана (~3-4 байта на каждый пиксель, ведь он распаковывает картинку в память и работает с ней как с .bmp). к сожалению, уже времени посмотреть нет, убегаю от компьютера.

    Попробуй запустить без ключа -verbose
     
  9. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    без этого ключа- битые картинки он определяет как нормальные, не вариант.
     
  10. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Да уж. Интересно, для какого сайта тебе требуются эти картинки...
    У меня браузер не может открыть эту картинку, вылетает, наверное от ограничений в памяти)))

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