помогите с сравнением изображений

Тема в разделе "Как сделать...", создана пользователем Juri, 23 окт 2008.

Статус темы:
Закрыта.
  1. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.065
    Симпатии:
    197
    Вот такой вопрос, как можно при загрузке фотографий в галерею проверять есть ли такие уже.
    вот допустим есть 10к фоток и я заливаю еще 5к как можно проверить нет ли дублей?

    есть задумка над тем что при заливке можно фотку уоткрывать как фаил и делать хэш содержимого, но не знаю как это будет работать или нет. подскажите плиз, заранее благодарен.
     
  2. DIAgen

    DIAgen Постоялец

    Регистр.:
    30 окт 2006
    Сообщения:
    134
    Симпатии:
    72
    Ну я бы реализовал бы так.
    1) Для уже имеющихся фотографий делаем md5_file и заносим а базу данных. Тут же можно удалит дубликаты.
    2) Заносим хэши файлов в базу
    3) Затем проиндекривал базу при момощи Sphinx
    4) При добавлении новой фотографии проверял через Sphinx хэш новой фотографии, если вернул что нет в базе такого хэша сохраняем и заносим в базу данных

    Думаю понятно почему использовать Sphinx а не работать с базой данных на прямую.
     
  3. Hemi-Sync

    Hemi-Sync Постоялец

    Регистр.:
    17 дек 2006
    Сообщения:
    88
    Симпатии:
    38
    DIAgen

    Зачем индексировать с помощью Sphinx? Хеши - это одна колонка. Ее нет смысла индексатором проходить.

    ТС
    Храни хеши в базе данных или в файлах. Потом прочитай все в массив (Базу данных всегда лучше поменьше дергать) и простым in_array(). Разницу дописываешь в базу или файл. Также можно что-то намного проще и быстрее md5 использовать. Но в таком случае еще хранить размер картинки ( можно еще высоту и ширину) дабы избежать ложных срабатываний. Тут на месте потом замеришь скорость, чтобы понять, что быстрее.
     
  4. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.065
    Симпатии:
    197
    ну md5 достаточно быстр и удобен. но не будет проблем если из базы сразу 50000 70000 фотографий в массив засунуть?
     
  5. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    558
    md5 не выход. Если у картинок разные размеры и качество? Когда то видел скрипт на перл, который учитывал размеры и качество, но даже не помню его названия.
    Есть ещё варианты? мне тоже интересна тема.
     
  6. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.065
    Симпатии:
    197
    вот в этой галерее как то определяют что фотки уже были загружены. но как сделали не знаю, галера по ходу самописная

    my-photo.ru
     
  7. Hemi-Sync

    Hemi-Sync Постоялец

    Регистр.:
    17 дек 2006
    Сообщения:
    88
    Симпатии:
    38
    Если у картинки разные размеры и качество то и md5 будет другим. И картинка эта по праву считается другой, несмотря на то, что на ней изображено.

    Juri
    ЭЭЭ как у вас цифры разнятся.
    Считай сам. Длина хеша мд5 32 знака=32 байта. 70000*32 = приблизетльно 2187 мегабайта. В пхп по дефолту помнится 8 метров на скрипт дается. Так что хватает. Скорость конечно не бог весь что, но уж куда быстрее, чем 50кило раз базу дергать.
     
  8. DIAgen

    DIAgen Постоялец

    Регистр.:
    30 окт 2006
    Сообщения:
    134
    Симпатии:
    72
    Вот написал такую фунцию
    PHP:
    function cheak_file_md5 () {
        if (
    $handle opendir('news')) {
            while (
    false !== ($file readdir($handle))) { 
                if (
    $file != "." && $file != "..") { 
                    echo 
    $md5_file 'md5_file 'md5_file ('news/' $file);
                    echo 
    ' , md5_file + images_width + images_height ';
                    
    $getimagesize getimagesize'news/' $file );
                    
    $images_width $getimagesize ['0'];
                    
    $images_height $getimagesize ['1'];
                    echo (
    md5($md5_file.$images_width.$images_height));
                    echo 
    '<br>'
                } 
            }
            
    closedir($handle); 
        }
    }

    cheak_file_md5();
    Рузультат вот такой
    Там одна и таже картинка, только во второй картинке изменен 1 байт.

    А зачем использовать Sphinx, так для проверке потребуеться всего 0,02-0,01 секунды, а если делать такой же запрос на прямую если там 15-20 к, будет на много больше времени.

    Не будет лишних запросов к базе даных, и я думаю что в таблице храниться не только хэш картинки, но и название, поисание, может быть ширини и высота, автор и т.д

    Может я где то и ошибаюсь.
     
  9. vaad2

    vaad2 Постоялец

    Регистр.:
    18 дек 2006
    Сообщения:
    60
    Симпатии:
    9
    sphinx не нужен, и если названия картинок не важно, то сразу md5_file в название, проверка осуществляется file_exist.
    если md5 не нравиться, можно размер файла сравнивать + значение пары байтов, хотя конечно совпадения могут быть...
     
  10. DIAgen

    DIAgen Постоялец

    Регистр.:
    30 окт 2006
    Сообщения:
    134
    Симпатии:
    72
    Можно и не использовать, только нагрузка на базу будет большая когда заносить 5к фоток :)
     
Статус темы:
Закрыта.