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

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

Сравнение изображений [D7, WinXP]


Grief ©   (2005-04-20 18:43:00) 

Как "быстро" проверить, что на двух битмапах АБСОЛЮТНО одинаковое изображение? попиксельно - медленно, а канвасами (Bitmap1.canvas = Bitmap2.canvas - не получается! :()


Grief   (2005-06-04 23:55:00) [1]

scanline вроде работает
можно ими прям и сравнивать


Jeer   (2005-04-21 14:24:00) [2]

CRC-файл в том случае, если нет необходимости визуализации.
Иначе, через CompareMem.
Можно, конечно, CRC memory, но смысл ? Медленнее.


Grief   (2005-04-21 12:34:00) [3]

Магнитоныч, спасибо, надо будет разобраться *чешу репу*...
Jeer, а как получить CRC не файла? то есть битмап есть только в памяти? Да и у файла я не совсем знаю как это сделать...


Jeer   (2005-04-21 11:24:00) [4]

CRC file


WondeRu   (2005-04-21 10:25:00) [5]

GetDIBits + CompareMem


Магнитоныч   (2005-04-20 22:42:00) [6]

Для растров с bpp > 8

functionBitmapsEqual(Bmp1, Bmp2: TBitmap): Boolean;
varH, H2, LineLength, y: Integer;
   DS: TDIBSection;

  functionEqualLine(Line: Integer): Boolean;
  begin
   Result := CompareMem(@Bmp1.ScanLine[Line]^,
                        @Bmp2.ScanLine[Line]^, LineLength)
  end;

begin
 Result := False;
 { Сравнение базовых параметров }
  if(Bmp1.PixelFormat <> Bmp2.PixelFormat) or
    (Bmp1.Width <> Bmp2.Width) or(Bmp1.Height <> Bmp2.Height) or
    (Bmp1.Width < 1) or(Bmp1.Height < 1)
  thenExit;

  ifGetObject(Bmp1.Handle, SizeOf(DS), @DS) > 0
    thenLineLength := DS.dsBm.bmWidthBytes
    elseExit; //error

 H := Bmp1.Height - 1;
  ifH = 0 then
   Result := EqualLine(0)
  else begin
   Result := True;
   H2 := ((H+1) div2) - 1;

   { Сравниваем строки. Цикл проходит строки одновременно сверху
     и снизу, сходясь в центре: так больше вероятность
     скорейшего обнаружения отличающихся пикселей. }
    fory := 0 toH2 do
      if( notEqualLine(y)) or( notEqualLine(H-y)) then
      begin
       Result := False;
       Exit;
      end;

   { Если высота не кратна двум, сравниваем средние строки,
     которые пропустили в цикле. Это сделано, чтобы дважны
     не вызавать CompareMem для одной строки. }
    if(H mod2) = 0 then
     Result := EqualLine(H2 + 1);
  end;
end;


Наверх

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