Страница: 1 | 2 |
Вопрос: Попиксельное сравнение картинок
Добавлено: 07.06.10 13:36
Автор вопроса: Spiritsun
Ответы
Всего ответов: 28
Номер ответа: 16
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #16
Добавлено: 09.06.10 13:46
Мы говорим о картинках на винте или о картинках, скажем, в ресурсах или загруженных в память? Как тогда быть? Эти "стандартные" средства тоже в состоянии вычислить контрольную сумму? Или все же придется снизойти до перебора массива и подсчета искомой суммы?
Номер ответа: 17
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #17
Добавлено: 09.06.10 13:57
А теперь напряги свою извилину и немного подумай, что при этом произойдет.. (навскидку)
1. Создастся графический контекст (достаточно ресурсоемкая операция, аналог CreateGraphics)
2. Выделится кусок памяти для новой картинки
3. И далее по кругу:
- берем байт из первой кртинки
Номер ответа: 18
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #18
Добавлено: 09.06.10 14:02
сорри..
- берется байт из второй
- вычисляется маска
- помещается в новую картинку..
и так до конца всего массива .. точнее до КОНЦА картинки!
Я же предложил: в хуждем варианте имея указатель на картинку через маршалинг сдампить кусок памяти.. (имхо,затраты минимальные) и в одном цикле пробежаться по байтам.. Если первый байт различается, то нех дальше и сравнивать...
Твой вариант - реально, пособие для начинающих извращенцев..
Номер ответа: 19
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #19
Добавлено: 09.06.10 14:04
Разумеется мой вариант приемлем если картинки уже загружены в память..
Номер ответа: 20
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #20
Добавлено: 09.06.10 14:33
Имхо, если загружать в буфер через GetDIBits, а процедуру сравнения написать на ассемблере (даже тупо repne cmpsb), то на картинках относительно небольших размеров время сравнения будет очень мало.
Номер ответа: 21
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #21
Добавлено: 09.06.10 14:58
сорри..
- берется байт из второй
- вычисляется маска
- помещается в новую картинку..
и так до конца всего массива .. точнее до КОНЦА картинки!
Я же предложил: в хуждем варианте имея указатель на картинку через маршалинг сдампить кусок памяти.. (имхо,затраты минимальные) и в одном цикле пробежаться по байтам.. Если первый байт различается, то нех дальше и сравнивать...
Твой вариант - реально, пособие для начинающих извращенцев..
Да, но зато в нем нет циклов, и он, все же, работает быстрее, чем побайтавая херь. Конечно, Unmanaged-вася работает по скорости приближенно равной этой, но все равно, BitBlt по моим понятиям работает быстрее циклов. Насчет "создать битмап" - да ради бога, можете использовать один из данных и рисовать и ресайзить прямо на нем. Такое никто не запрещал.
Номер ответа: 22
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #22
Добавлено: 09.06.10 14:59
работает быстрее, чем побайтавая херь
Она, конечно сама по себе и есть побайтовая херь, но там вроде сделано все пошустрее, со всякими SSE и прочей лабудой.
Номер ответа: 23
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #23
Добавлено: 09.06.10 15:29
улыбнуло ))) а что там если не циклы?? Волшебная палочка которая сама все сравнивает? теже циклы только на более низком уровне.. без проверок выхода за границы массивы и прочей хрени..
Вся фишка в том, что в твоем случае будут обрабатываться абсолютно ВСЕ байты (при чем через жопу).. в моем же до первого неодинакового байта..
даже если делать средствами НЕТ на картинках 1280*1024 время обработки составит доли секунды.. Причем львиную долю времени будет занимать не дампирование памяти и сравнение, а именно загрузка картинки в память и создание объекта Graphics(применительно к моему варианту). Если использовать другие способы загрузки картинки и обработки, то время будет несравнимо меньше..,имхо
Номер ответа: 24
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #24
Добавлено: 09.06.10 15:37
низком уровне..
Во, я как раз это и имел в виду.
Вся фишка в том, что в твоем случае будут обрабатываться абсолютно ВСЕ байты (при чем через жопу).. в моем же до первого неодинакового байта..
Да, но зато моя вася не будет рыпаться на чувака из-за твоего одного пикселя. Имхо, точное сравнение картинок васе врят ли нужно, ибо JPEG и прочая херь с его артефактами. Так что в моем случае как раз получается некая степень похожести, а не точное сравнение. Короче здесь зависит от того, что нужно васе.
Номер ответа: 25
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #25
Добавлено: 09.06.10 15:43
Да, но зато в нем нет циклов, и он, все же, работает быстрее, чем побайтавая херь. Конечно, Unmanaged-вася работает по скорости приближенно равной этой, но все равно, BitBlt по моим понятиям работает быстрее циклов. Насчет "создать битмап" - да ради бога, можете использовать один из данных и рисовать и ресайзить прямо на нем. Такое никто не запрещал.
Хочешь бенчмарк сделать? Я ставлю на то что обычный unsafe код (C#) будет как минимум на 2 порядка быстрее чем тот бред который ты придумал.
Номер ответа: 26
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #26
Добавлено: 09.06.10 16:01
А если сжимать через WPF? :D
Номер ответа: 27
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #27
Добавлено: 09.06.10 17:21
ну тогда можно воспользоваться CUDA и сравнивать файл в многопоточном режиме.
Номер ответа: 28
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #28
Добавлено: 09.06.10 22:55
Боюсь, нечетким сравнением графической информации тебе еще рано заниматься. Надо сначала как минимум изучить на хорошем вузовском уровне матан, линал, функан, тервер, дискру, после чего переходить к более специальным основам.