![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнинеи двух 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;
Ну и зачем дальше делать сравнение? Если мы уже знаем, что рисунки не одинаковы, то разумней было бы сразу же выйти из функции.
//==========================================================
Месяц сам такую написал. Нужно для игры.