Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.30;
Скачать: CL | DM;

Вниз

Сравнение изображений   Найти похожие ветки 

 
Grief ©   (2005-04-20 18:43) [0]

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


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

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

function BitmapsEqual(Bmp1, Bmp2: TBitmap): Boolean;
var H, H2, LineLength, y: Integer;
   DS: TDIBSection;

 function EqualLine(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)
 then Exit;

 if GetObject(Bmp1.Handle, SizeOf(DS), @DS) > 0
   then LineLength := DS.dsBm.bmWidthBytes
   else Exit; //error

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

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

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


 
WondeRu ©   (2005-04-21 10:25) [2]

GetDIBits + CompareMem


 
Jeer ©   (2005-04-21 11:24) [3]

CRC file


 
Grief ©   (2005-04-21 12:34) [4]

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


 
Jeer ©   (2005-04-21 14:24) [5]

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


 
Grief ©   (2005-06-04 23:55) [6]

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



Страницы: 1 вся ветка

Текущий архив: 2005.10.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
14-1128445974
Kerk
2005-10-04 21:12
2005.10.30
провокация, которая может питать экстремистские настроения


14-1128489705
IfBeginThenEnd
2005-10-05 09:21
2005.10.30
Утечка памяти


2-1128443420
Alex_T
2005-10-04 20:30
2005.10.30
Подскажите плиз как корректно реализовать


1-1128415708
JohnKorsh
2005-10-04 12:48
2005.10.30
Вопрос по package.


14-1128525402
***_Diman_***
2005-10-05 19:16
2005.10.30
CeCreateFile - как вызвать?