![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнить 2 изображения
kitsumvi © (2006-10-28 14:54:00)Как проверить на идентичность два изображения (TBitMap)?
kitsumvi (2006-10-30 09:02:00) [1]Большое спасибо помогавшим. Особенно kami с Магнитонычем.
С уважением KitsumVI.
kami (2006-10-28 23:22:00) [2](с) Магнитоныч (20.04.05 22:42)
Для растров с 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;
Ketmar (2006-10-28 15:34:00) [3]Graphics.TBitmap. у него есть все необходимые свойства. в чатсности -- Width, Height, PixelFormat, ScanLine[].
kitsumvi (2006-10-28 15:32:00) [4]Идея понятна -). А вот как реализовать? Записывать изображения в файл и сравнивать? Не хотелось бы. Да и прямое сравнение не особо привлекает хотелось бы ограничится контрольной суммой (хотя по времени одинаково). Да и не нашел я ее в Дельфи.Прошу подсказать какими классами или функциями можно воспользоваться.
TIF (2006-10-28 15:15:00) [5]самый тупой способ - сравнить размеры изображений. Правда не всегда при совпадении объёмсов совпадают сами изображения :-О
Ketmar (2006-10-28 15:00:00) [6]сравнить каждый байтик. или пиксель.