Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сравнение картинок


Страницы:   1 2

able ©   (2004-02-21 16:07:00) 

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


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

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 можно текст красиво вывести, и то лучше в виртуальною поверхность, для будущего копирования из неё)


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

В справке было:
(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 14:08:00) [3]

не, 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 13:37:00) [4]

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


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

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

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


able   (2004-02-28 16:23:00) [6]

>Mantic0re
??


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

2 able:

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


hexone   (2004-02-26 17:22:00) [8]

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


able   (2004-02-26 13:10:00) [9]

>Mantic0re
lol)


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

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


able   (2004-02-24 17:13:00) [11]

нда


able   (2004-02-23 07:22:00) [12]

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


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

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

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

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


Mihey   (2004-02-22 19:57:00) [14]

2 able:

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


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

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1069399145&n=7


able   (2004-02-22 19:14:00) [16]

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


Mihey   (2004-02-22 18:18:00) [17]

2 miek:

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


miek   (2004-02-22 16:44:00) [18]

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


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

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


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

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо