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