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

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

сравнение двух картинок TImage [D7, XP]


worldmen ©   (2008-10-27 11:18:00) 

Какие свойства использовать TImage, чтоб сравнить 2-е картинки - одинаковые они они или нет?


worldmen   (2008-10-27 15:51:00) [1]

Понял. Надо было поставить

Bmp1.PixelFormat := pf24Bit;
....
Bmp2.PixelFormat := pf24Bit;

Теперь, пооже работает правильно.


clickmaker   (2008-10-27 15:38:00) [2]

> как проверять 24-ти и 32-х битные?

а с ними-то какие проблемы? true color, палитры нет, каждый байт (вернее триада RGB) соответствует реальному цвету


worldmen   (2008-10-27 15:31:00) [3]

Я понял: TByteArray используется для  pf1bit-ным картинкам, а как проверять 24-ти и 32-х битные?


worldmen   (2008-10-27 15:25:00) [4]

Мне надо сравнивать скриншоты. Я делаю так:

var
  bmp1 :TBitmap;
  bmp2 :TBitmap;
.....
procedure TForm1.BitBtn1Click(Sender: TObject);
var
 x,y, h,w : integer;
begin
   ...
   bmp1 := TBitmap.Create;
   bmp1.Width := w; //Screen.Width;
   bmp1.Height := h; //Screen.Height;
   StretchBlt(bmp1.Canvas.Handle,0,0, w,h, GetDC(0),x,y, w,h, SRCCOPY);

   Image1.Width := w; // Screen.Width;
   Image1.Height:= h; // Screen.Height;
   Image1.Picture.Assign(bmp1);
   //bmp1.Free;
end;

Таких две процедуры- делают две картинки (для Image1 и Image2).
Потом я их сравниваю:

var i,j :integer;
   P1,P2 : PByteArray;
   yes, no : integer;
   T1, T2 :TTime;
begin
   T1:=Now;
   yes:=0; no:=0;
   for i:=0 to Bmp1.Width-1 do
   begin
     Label10.Caption:='I='+IntToStr(i);
     P1 := Bmp1.ScanLine[i];
     P2 := Bmp2.ScanLine[i];
     for j := 0 to Bmp1.Height-1 do
     begin
       Label11.Caption:='J='+IntToStr(J);
       if P1[j] = P2[j] then  inc(yes)
       else inc(no);
     end;
   end;
   Label9.Caption:= 'Одинаковых='+IntToStr(yes)+'. Не одинаковых='+IntToStr(no);

Если, например, взять картинку 50х50 пиксел - переменная Yes показывает совпадение всех 2500 пиксель даже если треть картинки другая.
Если больше половины картинки изменилось - то показывает изменилось 25%
что делаю не так?


Правильный$Вася   (2008-10-27 13:06:00) [5]

проще сохранить оба в файл одинакового формата и сделать команду FC


brother   (2008-10-27 11:21:00) [6]

image1.Picture.Bitmap.ScanLine


brother   (2008-10-27 11:18:00) [7]

scanline?


Наверх

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