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

Вниз

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

 
kitsumvi ©   (2006-10-28 14:54) [0]

Как проверить на идентичность два изображения (TBitMap)?


 
Ketmar ©   (2006-10-28 15:00) [1]

сравнить каждый байтик. или пиксель.


 
TIF ©   (2006-10-28 15:15) [2]

самый тупой способ - сравнить размеры изображений. Правда не всегда при совпадении объёмсов совпадают сами изображения :-О


 
kitsumvi ©   (2006-10-28 15:32) [3]

Идея понятна -). А вот как реализовать? Записывать изображения в файл и сравнивать? Не хотелось бы. Да и прямое сравнение не особо привлекает хотелось бы ограничится контрольной суммой (хотя по времени одинаково). Да и не нашел я ее в Дельфи.Прошу подсказать какими классами или функциями можно воспользоваться.


 
Ketmar ©   (2006-10-28 15:34) [4]

Graphics.TBitmap. у него есть все необходимые свойства. в чатсности -- Width, Height, PixelFormat, ScanLine[].


 
kami ©   (2006-10-28 23:22) [5]

(с) Магнитоныч   (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;


 
kitsumvi ©   (2006-10-30 09:02) [6]

Большое спасибо помогавшим. Особенно kami с Магнитонычем.

С уважением KitsumVI.



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

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

Наверх




Память: 0.48 MB
Время: 0.029 c
15-1161493938
pkm
2006-10-22 09:12
2006.11.12
Восстановление инфы.


15-1161775937
Шариков
2006-10-25 15:32
2006.11.12
Опера на яве !!


15-1161447664
ProgRAMmer Dimonych
2006-10-21 20:21
2006.11.12
Помогите найти текст


15-1161323524
xayam
2006-10-20 09:52
2006.11.12
Уравнение любви


15-1161705433
vidiv
2006-10-24 19:57
2006.11.12
Помогите найти документ.