Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

сравнение картинок   Найти похожие ветки 

 
able ©   (2004-02-21 16:07) [0]

Здраствуйте, ув. Мастера! Как сравнить две картинки и вычислить изменившиюся часть, с координатами. Если можно, с примерами.


 
MBo ©   (2004-02-21 16:10) [1]

1. попиксельно
2. GetDiBits в массив, затем проXOR-ить два массива, где не 0 - изменение было.


 
miek ©   (2004-02-21 16:21) [2]

Только лучше всего этого не делать.
Времени много уйдет, результат при малейших ошибках  -нулевой


 
MBo ©   (2004-02-21 16:43) [3]

>miek
???


 
able ©   (2004-02-21 16:55) [4]

Для полноты вопроса скажу, что у меня идёт пересылка экрана удалённого компьютера, вот я и хочу оптимизировать...


 
miek ©   (2004-02-22 10:58) [5]

2MBo: сравнение образов неблагодарная вещь!


 
Думкин ©   (2004-02-22 11:58) [6]

> [5] miek ©   (22.02.04 10:58)

В чем именно? А если отличие и заключаетсяв одном пикселе - как вы благодарно его найдете?


 
able ©   (2004-02-22 12:00) [7]

Нет, давайте нормально.. с примерами :)


 
miek ©   (2004-02-22 16:44) [8]

2Думкин: нужно ТОЧНО знать заранее, как були получены изображения. Например, быть уверенным, что картинка изменилась на Х пикселей и не более. Иначе - задача неразрешима.


 
Mihey ©   (2004-02-22 18:18) [9]

2 miek:

Разрешима ещё как. Как по твоему делается сжатие видео? Запоминается отличие одного кадра от другого (если это целесообразно, так как порой бывает легче запомнить полностью новый кадр). К тому же, в данной задаче идёт скриншот, т.е. довольно чёткая картинка. Ведь не требуется сравнить образы, а требуется найти, какие пиксели отличаются, запомнить их и переслать.


 
able ©   (2004-02-22 19:14) [10]

>Mihey ©   (22.02.04 18:18) [9]
Супер :) ещё б пример :))


 
фи   (2004-02-22 19:57) [11]

http://delphimaster.net/view/8-1069399145/


 
Mihey ©   (2004-02-22 19:57) [12]

2 able:

Почитай про быстрый доступ к пикселям:
http://www.efg2.com/Lab/ImageProcessing/Scanline.htm


 
Думкин ©   (2004-02-23 06:56) [13]

Про быстрый доступ к пикселам есть и тут статья, один из авторов - MBo.

> [8] miek ©   (22.02.04 16:44)
> Иначе - задача неразрешима.

что значит - не разрешима? Ведь речь идет об изображениях одного размера и пиксельного формата, или как?


 
able ©   (2004-02-23 07:22) [14]

>что значит - не разрешима? Ведь речь идет об изображениях >одного размера и пиксельного формата, или как?
Нда, в которых, например, курсор сдвинулся на пару пикселей


 
able ©   (2004-02-24 17:13) [15]

нда


 
Mantic0re   (2004-02-25 12:36) [16]

2 MBo:
 Респект - лучше трудно придумать:
"GetDiBits в массив, затем проXOR-ить два массива, где не 0 - изменение было."


 
able ©   (2004-02-26 13:10) [17]

>Mantic0re
lol)


 
hexone ©   (2004-02-26 17:22) [18]

Вычитанием. См. "Практическая обработка изображений на языке С++"
Тебе нужно вычесть из одной картинки другую, в результате получишь изменения.


 
Mantic0re   (2004-02-27 10:51) [19]

2 able:

lol)
что за хрень ?


 
able ©   (2004-02-28 16:23) [20]

>Mantic0re
??


 
?   (2004-03-02 12:42) [21]

хмм, делать дано XOR"ом (что бы скучно не было)
допусти есть 2 BMP-шки
bmp1,bmp2
SelectObject(hdc1,bmp1);
SelectObject(hdc2,bmp2);
BitBlt(hdc1,0,0,width,height,hdc2,0,0,SRCINVERT);

после этой операции в hdc1 у тебя будит только изменившияся часть, т.е не изминившейся часть станет просто чёрной, тебе это нужно вообще зачем? если для передачи по сети то кидай в PNG или сжимай как то, ну и отправляй а потом опять проделывай эту операцию на клиенте, и в итоге изоражение будит восстановленно в нормальный вид.


 
Petro   (2004-03-02 13:37) [22]

Подскажи что делают:
SelectObject(hdc1,bmp1);
SelectObject(hdc2,bmp2);
Создают в оперативке COmpatibleDC?
В справке прочитал, что BitMap можно для них только один раз.
Это как?


 
?   (2004-03-02 14:08) [23]

не, SelectObject просто как бы устанавливают опцию для данного DC, т.е система уже сама определяет какой тип в качестве 2-го параметра передаём, так же можно передавать HFONT,HPEN,HBRUSH...
например есть мы передаём HFONT то устанавливается шрифт для данного контекста (DC). если же мы передаём HBITMAP то устанавливается поверхность на которой мы рисуем, сам по себе CombitibleDC это пустое место, ему рисовать не где. вернее пустой DC это картинка в памяти 1x1 пиксель и то монохромная. поэтому когда мы
вызываем SelectObject(hdc1,bmp1) мы указываем что бы при рисовании hdc1 использвал поверхность bmp-шки bmp1;
CompatibleDC создаёт функция
CreateCompatibleDC(HDC hdc);
в качестве параметра мы передаём некий контекст, это необходимо для того что бы создаваемый нами DC имел такие же аттрибуты как и передаваймый в параметре. обычно передают HDC всего дисплея, который получают функцией GetDC(0);

>В справке прочитал, что BitMap можно для них только один раз.
т.е?


 
Petro   (2004-03-02 14:47) [24]

В справке было:
(Bitmaps can be selected for memory device contexts only, and for only one device context at a time.)
Это меня и смутило.
1. А если бы:
var
h1, h2 : HDC;

h1 := bmp1.hdc;
h2 := bmp2.hdc;
BitBlt(h1,0,0,width,height,h2,0,0,SRCINVERT);

Это не то-же самое?
2. Ответь плиз на ветку
GDIsurface (miek  02.03.04 10:01)
-если есть DC DirectDraw бысрее будет рисовать не на ней, а на CompatibleDC от неё и потом бросать на эту DC?
-CompatibleDC отличается от DC создаваемой DirectDraw?


 
?   (2004-03-02 15:13) [25]

1. тоже самое, просто на самом деле у bmp-шки нет никакого HDC, это уже класс в Delphi создаёт совместимый контекст что бы рисовать можно было.
2. The IDirectDrawSurface::GetDC method creates a GDI-compatible handle of a device context for the surface.
т.е, эта функция вернёт тебе совместимый HDC, но если данная поверхность является первичной, то вывод соответственно будит выводиться сразу на экран, что очень медленно, если ты работаешь в полно экранном режиме то тут проще, указываешь на использовании вторичного буффера, после чего вывод осуществяешь в не видимую поверхность, затем вызываешь Flip который просто переключает 2 поверхности, и т.д (вернее изменяют указатель на некоторую область памяти, которая используется для вывода на экран).
если же ты работаешь в оконном режиме то, вызвать Flip уже не получиться, тогда создаёшь ещё одну поверхность в памяти, на ней рисуешь после чего вызываешь Blt, с помощью этой функции ты просто копируешь из виртуальной поверхности в реальную.
DirectDrawSurface::GetDC для использоватьния ничем не отличается от обыкновенного DC для пользвателя, ты так же можешь работать с ней через Gdi. если у тебя есть HDC (от DirectDrawSurface) которая является первичной то вывод будит осуществляться на экран, если же вторичной или виртуальной то будит осуществляться в память, что намного быстрее.
ps: в реальных проэктах создают виртуальную поверхность (именно IDirectDrawSurface, а не CreateCompatibleDC), в которой храняться готовые спрайты, после чего просто копируют их на поверхность вторичной поверхности, а потом когда вся сцена прорисована флипят, gdi очень медленная, поэтому лучше делать именно так как описоно выше, хотя через gdi можно текст красиво вывести, и то лучше в виртуальною поверхность, для будущего копирования из неё)



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.057 c
7-1080646553
pumba
2004-03-30 15:35
2004.05.16
Windows DDK


4-1080451471
C.A.M.
2004-03-28 09:24
2004.05.16
Восстановление сетевого подключения


11-1047229006
b82
2003-03-09 19:56
2004.05.16
richedit


14-1082994194
}|{yk
2004-04-26 19:43
2004.05.16
Как вы относитесь к высказыванию кажется Бернарда Шоу


1-1083221337
Master Paleva
2004-04-29 10:48
2004.05.16
Таскбар





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский