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

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

Сравнинеи двух image. [D6, XP]


pavelkq ©   (2009-01-15 14:40:00) 

Пишу функцияю сравнения по первому квардатику 10х10 пикселей.
function TOKBottomDlg1.compare :boolean;
var x,y: integer;
begin
result:=true;
for x:=0 to 10 do
 for y:=0 to 10 do
   if Image2.Canvas.Pixels[x,y]<>Image3.Canvas.Pixels[x,y] then
     begin
       result:=false;
     end;
end;

Иногда работает на ура, а иногда уже со второй строки идут сильные несовпадения, хотя рисунки совершенно одинаковые.
В чем тут проблема? Есть ли другие, быстрые методы сравнения рисунков типа if image1=image2 ?


Pavelkq   (2009-01-15 19:22:00) [1]

Хм, меня терзают смутные сомнения, что при первом обращении картинка рисуется нормально и сравнивается. А второй раз она рисуется поверх первой, а сравнение битов идет где-то из под низу.
Ну, точно! Перед тем, как назначить новую картинку из базы ее надо зачистить. Теперь все заработало.
Всем спасибо! Тема закрыта.


Б   (2009-01-15 19:02:00) [2]

> Эти рисунки точно одинаковые.
А вдруг нет?
Нарисуй в Paint и проверь. Или учти слова Правильного Васи.

> А где в факах? Я покопал, не нашел :-(

http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988625229&n=21

> можно кусок кода представить?

Делаешь то же самое только при помощи ScanLine -
работает очень быстро, по сравнению со свойством канвы Pixels.


Pavelkq   (2009-01-15 18:31:00) [3]

А где в факах? Я покопал, не нашел :-(

> Б
можно кусок кода представить?


pavelkq   (2009-01-15 16:00:00) [4]

Эти рисунки точно одинаковые. Просто один из них хранится в БД и грузится оттуда, а второй открывается через буфер обмена. Надо установить, есть ли в базе такой рисунок или нет.
Один назначаю из буфера обмена:
image.Picture.Bitmap.Assign(Clipboard)
А другой из базы:
BS:= TADOBlobStream.Create(TBlobField(DBGrid1.Fields[3]), bmRead);
BS.Seek(0, soFromBeginning);
bmp:=TBitmap.create;
bmp.LoadFromStream(BS);
Image3.Picture.Bitmap.Assign(bmp);


pavelkq   (2009-01-15 15:53:00) [5]

Я не силен в обращении к памяти, но по логике, эти оба рисунка лежат в памяти. Нужно сначала найти качало каждой области, а потом сравнить побайтно всю длинну! Как это можно реализовать?


Правильный$Вася   (2009-01-15 15:36:00) [6]


> рисунки совершенно одинаковые

палитра, глубина цвета, формат?


Б   (2009-01-15 15:36:00) [7]

> Месяц сам такую написал. Нужно для игры.
Имеется в виду месяц назад.


Б   (2009-01-15 15:35:00) [8]

Можешь для проверки сделать следующее.
В Painte залей растр, к примеру жёлтым цветом, сохрани. Потом нарисуй маленькую точку другим оттенком тоже жёлтого. Визуально кажется, что картинки одинаковы, а на самом деле совсем иначе.


{RASkov}   (2009-01-15 15:29:00) [9]

> [0] pavelkq   (15.01.09 14:40)
> хотя рисунки совершенно одинаковые.

Точно? Или только визуально, а на самом деле один битмап а другой - с него сделанный джепег....
Оттенков цвета сам понимаешь, полно.... тебе видно одинаково, а "компу" по разному все...


Б   (2009-01-15 15:27:00) [10]

> Быстрые методы сравнения рисунков типа if image1=image2?

Конечно же есть. Зайди в FAQ ---> Графика.


 if Image2.Canvas.Pixels[x,y]<>Image3.Canvas.Pixels[x,y] then
    begin
       result:=false;
    end;


Ну и зачем дальше делать сравнение? Если мы уже знаем, что рисунки не одинаковы, то разумней было бы сразу же выйти из функции.

//==========================================================
Месяц сам такую написал. Нужно для игры.


Наверх

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